如何在执行bash脚本之前编辑其输出?

如何在执行bash脚本之前编辑其输出?,bash,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

例如,看下面一行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删除或忘记命令。您需要触摸~/.命令才能工作

如果我能在执行sc之前编辑它的输出,那就更有用了

history -s whatever you want

将在bash历史记录中附加任何您想要的内容。然后一个简单的向上箭头或!!如果您已启用shopt histreedit,则输入-我想这是我正在考虑的选项,但不是100%确定,它将在命令行上为您提供您想要的任何内容,以便编辑。

关于您的别名的一些注释:

简化报价:

alias rc='awk "{print NR,\$0}" ~/.commands ...'
无需tail,您可以将对sed的调用组合在一起:

简化评估,无需$IFS:


@哦,你应该把这些命令放到子程序中,当你想使用它们的时候,把它们编出来。摘自丹尼斯的答案

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
}


也许你可以用preexec.bash

在相关说明中,您还可以使用ctrl-x-e编辑当前命令行

干杯


tavod是可能的,但希望它需要不必要的用户交互。由于脚本的目的是尽量减少按键,我希望有另一种解决方案。那么,为什么不让脚本在命令行中使用read-p$PS1\u this\u asthy-e-I which you want可能离第一个解决方案还有一步,但是制表符完成呢?我不想为了另一个而放弃一个便利。我在那里有带-e标志的readline。所以制表符完成是有效的,至少它在这里对文件路径有效。您不会得到的是编程完成,它知道第一个参数应该是PATH中的可执行文件,第二个参数应该是文件,等等。也许也有一些方法可以得到它,但会更难。无论如何,您仍然可以获得简单的文件路径完成。我的bash不知道-我和我无法运行该示例。然而,我可以使用完成,但给定的参数消失了。一个基于ls*.jpg的初始简单示例的完整示例如何?我想将其更改为ls*.png?ac的简化是正确的。我更改了原始帖子。rc必须保持原样,因为你想要的报价在这里不起作用-试试看。sc也不能通过丢弃$IFS进行优化,因为如果~/.commands中的行上有空格,它会破坏数组。@tuner07:select语句中的+=和${text[@]}引号消除了对IFS的需要,并且仍然处理命令中的空格。我确实试过我的方法。反斜杠避开了美元符号,不需要额外的报价。用我的更改尝试sc和rc。它们很管用,当然读起来更好。但那不是我的兴趣;-事实上,它应该尽可能地简短和简单,以允许我从MidpSSH JavaME shell轻松地设置它。对这个问题有什么建议吗?
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'
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
}
$ source /path/to/library.sh  
$ . /path/to/library.sh