请使用以下行考虑以下文件inject.sh
:
#!/bin/bash
bind '"\e[0n": "echo test"'; printf '\e[5n'
当运行source inject.sh
时,它会在新行(而不是回声)上注入文本'echo test'。这可以正常使用,根据以下建议之一:https://unix.stackexchange.com/a/213821
我想用可能提供给脚本的所有命令行参数替换“echo test”部分,因此基本上使用$@
。但是我很难将它添加到命令中。我尝试过:
#!/bin/bash
bind '"\e[0n": "'$@'"'; printf '\e[5n'
但只有在向命令传递一个参数时才有效。例如:
source inject.sh ls
- > bash-3.2$ ls|
确定(|是光标)
source inject.sh echo foo
- > bash-3.2$ echo|
不行(不打印'foo',另外它弄乱了终端,不能打印一些字母了)
不确定问题出在哪里......可能错误的字符串连接?
请注意,这是一个bash
特定问题,而不是zsh
,fish
或其他问题。但是为了参考,我试图模仿zsh
print -z $@ echo foo
行为
答案 0 :(得分:2)
您可以使用:
#!/bin/bash
bind '"\e[0n": "'"$*"'"'; printf '\e[5n'
当你调用source inject.sh foo bar baz
时,你想连接它们并将它们放在同一个参数中:
bind '"\e[0n": "foo bar baz"'
但相反,你将它分成三个无效的参数:
bind '"\e[0n": "foo' 'bar' 'baz"'
调试方法包括ShellCheck,它可以发现两个问题:
In inject.sh line 2:
bind '"\e[0n": "'$@'"'; printf '\e[5n'
^-- SC2068: Double quote array expansions to avoid re-splitting elements.
^-- SC2145: Argument mixes string and array. Use * or separate argument.
和set -x
显示命令如何被破坏:
++ bind '"\e[0n": "foo' bar 'baz"' # Invalid attempt
++ bind '"\e[0n": "foo bar baz"' # Valid command