如何将命令行参数插入bind命令?

时间:2018-01-29 23:31:00

标签: bash

请使用以下行考虑以下文件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特定问题,而不是zshfish或其他问题。但是为了参考,我试图模仿zsh

print -z $@ echo foo行为

1 个答案:

答案 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