例如,请查看以下bash-code行
eval `echo "ls *.jpg"`
它列出了当前目录中的所有jpgs。现在我希望它只是将行打印到提示符,以便我可以在执行之前编辑它。 (比如键盘确实)
我该怎么做?
这个问题的原因来自一个更有用的别名:
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 :(得分:0)
history -s whatever you want
会在您的bash历史记录中添加“您想要的任何内容”。然后一个简单的向上箭头(或!!
然后输入如果你启用了shopt histreedit ---我认为这是我正在考虑的选项,而不是100%肯定),会给你“你想要的任何东西”命令行,准备编辑。
答案 1 :(得分: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'
答案 2 :(得分: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
答案 3 :(得分:0)
也许你可以使用preexec.bash?
http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
(在相关说明中,您也可以使用ctrl-x-e编辑当前命令行!)
欢呼声,
tavod