2016-10-30 190 views
1

有没有一种方法可以创建一个bash脚本,当它运行时会向命令行提供一些文本(要执行的命令)并将光标放在最后?从bash脚本提供命令行

所以它不应该执行命令,它只会发生,如果我按[Enter]键。我只是想能够有时改变命令中的一些参数。

例子:

# ./do_command.sh 
    # some__very_long_command_with_plenty_of_params param1 param2 param3 | <- and the cursor 
is here waiting for me to just approve hitting the [Enter] or possibly tweak the params before doing so 

什么我到目前为止只是脚本echo'ing的命令,这需要我复制粘贴。

+0

为什么不改为修改'。/ do_command.sh',以便*不需要修改/调整参数?这样,您可以将长命令放入脚本并自动执行。 – VM17

+0

因为我需要经常运行命令,有些参数只是稍微改变一些。我希望能够检查(并可能改变)默认参数,并且只要批准(按[Enter])就可以了。 – araches

回答

1

不知道你可以用Bash完全实现这一点。可能需要终端应用程序的一些附加功能。

我能想到的选择:

  • 写与充沛则params的每一个很长的命令可选参数Bash的功能。该功能还可以打印命令并要求确认;

例如:

myfunc() { 
    param1=${1:default1} 
    param2=${1:default2} 
    cmd="command --param $para1 --param $param2" 
    echo running $cmd 
    read -p "<ENTER> to run, <CTRL-C> to abort" 
    $cmd 
} 
  • 使用文本完井工具如DashTextExpander将提示您为参数,当你写字符的特定序列和你的时候写的结果按输入;

  • 使用bash别名与在线扩容:为每个充沛则params的很长命令的别名,然后键入别名,但不按Enter键(还),按CTRL-ALT-E ;该行将展开,您将能够查看,修改,然后按输入

例如:

$ aliase myfunc="command --param 1 --param 2" 
$ myfunc <CTRL-ALT-E> 
$ command --param 1 --param 2 
  • 使用“永久的历史与井号标签”:运行带有很长的命令用大量PARAMS一次的命令,但有评论终止给该行一个名字'。然后,你可以使用CTRL-R搜索的名称( '#标签')

例如:

$ command --param 1 --param 2 # myfunc 

然后键入CTRL-R

(reverse-i-search)`my': command --param 1 --param 2 # myfunc 

来检索命令。

+0

谢谢,别名,然后ctrl + alt + e正是我正在寻找。它让我把命令从专用脚本移动到.bashrc,但对我来说这更好。 – araches

0

do_command实际上只是read命令的一个包装。

cmd="some__very_long_command_with_plenty_of_params" 
args=("foo bar" "param2" "param3") 
read -e -i "$(printf '%q' "$cmd"; printf ' %q' "${args[@]}")" cmd 
eval "$cmd" 

一般来说,eval不宜使用,但在这里,你特别想执行任意命令,这是什么eval是专门做。这不比在bash提示处直接输入命令更危险。

-e命令告诉read使用Readline库编辑命令行(就像常规提示一样)。 -e提供了一个默认值。 printf命令确保命令名称和默认参数以可与eval命令重复使用的方式打印。请注意,%q不使用引号;它使用反斜杠只转义那些必须必须转义的字符,因此参数foo bar显示为foo\ bar,而不是"foo bar"'foo bar'