2010-02-17 70 views
1

例如看以下線的bash的代碼如何在執行之前編輯bash腳本的輸出?

eval `echo "ls *.jpg"` 

它列出當前目錄中的所有JPG文件。現在我希望它只是將行打印到提示中,以便在執行之前對其進行編輯。 (例如鍵盤按鈕)

我該怎麼做?


原因這個問題來自於一個更爲有用的別名:

alias ac="history 2 | sed -n '1 s/[ 0-9]*//p' >> ~/.commands; sort -fu ~/.commands > ~/.commandsTmp; mv ~/.commandsTmp ~/.commands" 
alias sc='oldIFS=$IFS; IFS=$'\n'; text=(); while read line ; do text=(${text[@]-} "${line}") ; done < ~/.commands; PS3="Choose command by number: " ; eval `select selection in ${text[@]}; do echo "$selection"; break; done`; IFS=$oldIFS' 
alias rc='awk '"'"'{print NR,$0}'"'"' ~/.commands; read -p "Remove number: " number; sed "${number} d" ~/.commands > ~/.commandsTmp; mv ~/.commandsTmp ~/.commands' 

ac添加或記憶上次輸入的命令,sc顯示可用的命令並執行它們和rc刪除或忘記一個命令。 (你需要touch ~/.commands之前)

如果我可以在執行它之前編輯sc的輸出將更加有用。

回答

0
history -s whatever you want 

會在你的bash歷史中追加「你想要的」。然後一個簡單的向上箭頭(或!!後面跟着輸入,如果你有shopt histreedit啓用---我認爲這是我正在考慮的選項,而不是100%確定),會在命令行上給你「任何你想要的」隨時可以編輯。

+0

這是可能的,但它需要(希望不要)用戶交互。由於腳本的目的是最小化擊鍵,我希望有另一種解決方案。 – Pascal 2010-02-17 12:45:55

+0

那麼,爲什麼沒有腳本僞命令行與'read -p「$ PS1_this_is_nasty」-e -i「無論你想要什麼」' – dubiousjim 2010-02-17 13:09:09

+0

也許離第一個解決方案一步之遙,但是tab-completion呢?我不想給另一個人放棄一個便利。 – Pascal 2010-02-17 15:24:25

0

你的別名,一些評論:

簡化報價:

alias rc='awk "{print NR,\$0}" ~/.commands ...' 

無需tail,你可以調用結合sed

alias ac="history 2 | sed -n '1 s/[ 0-9]*//p'..." 

簡化eval,且無需$IFS

alias sc='text=(); while read line ; do text+=("${line}") ; done < ~/.commands; PS3="Choose command by number: " ; select selection in "${text[@]}"; do eval "$selection"; break; done' 
+0

你說得對AC的簡化。我改變了原來的帖子。 RC必須保持原樣,因爲您打算引用的內容在這裏不起作用 - 請嘗試。 sc也不能通過拋棄$ IFS來優化,因爲它在〜/ .commands中有空格的情況下會破壞數組。 – Pascal 2010-02-17 15:14:49

+0

@ tuner07:'select'語句中'+ ='和'「$ {text [@]}的引用不需要'IFS',並且仍然處理命令中的空格。我按照我的方式嘗試了'rc'。反斜槓轉義美元符號,不再需要額外的引號。用我的更改試試'sc'和'rc'。他們工作。 – 2010-02-17 17:05:02

0

@OP,你應該真的把這些命令放入子程序中,當你想使用它們時,請將它來源。 (丹尼斯的回答採取)

rc(){ 
awk "{print NR,\$0}" ~/.commands ... 
} 

ac(){ 
history 2 | sed -n '1 s/[ 0-9]*//p'... 
} 

sc(){ 
text=() 
while read line 
do 
    text+=("${line}") 
done < ~/.commands 
PS3="Choose command by number: " 
select selection in "${text[@]}" 
do 
    eval "$selection" 
    break 
done 
} 

然後將其保存爲 「library.sh」 什麼的,當你想使用它

$ source /path/to/library.sh 

或者

$ . /path/to/library.sh 
+0

確定它讀得更好。但是這不是我的興趣;-)事實上,它應該儘可能的簡單和容易,讓我可以從我的MidpSSH JavaME shell中輕鬆設置它。有關該問題的任何建議? – Pascal 2010-02-17 16:34:09