2016-10-30 249 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'