【问题标题】:How do I edit the output of a bash script before executing it?如何在执行之前编辑 bash 脚本的输出?
【发布时间】:2010-02-17 12:10:05
【问题描述】:

例如看下面这行 bash-code

eval `echo "ls *.jpg"`

它列出了当前目录中的所有 jpg。现在我希望它只将行打印到提示符,以便我可以在执行之前对其进行编辑。 (例如,就像 key-up 一样)

我该怎么做?


这个问题的原因来自一个更有用的别名:

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 的输出,那将更加有用。

【问题讨论】:

    标签: bash


    【解决方案1】:
    history -s whatever you want
    

    将“随心所欲”附加到您的 bash 历史记录中。然后一个简单的向上箭头(或!!,如果您启用了 shopt histreedit,则后跟输入 --- 我认为这是我正在考虑的选项,不是 100% 确定),将在命令上为您提供“任何你想要的”行,可以编辑了。

    【讨论】:

    • 这是可能的,但它需要(希望是不必要的)用户交互。由于脚本的目的是尽量减少击键,我希望有另一种解决方案。
    • 好吧,那为什么不让脚本用read -p "$PS1_this_is_nasty" -e -i "whatever you want"伪造命令行
    • 也许距离第一个解决方案只有一步之遥,但制表符补全呢?我不想为了另一个而放弃一种便利。
    • 我用-e 标志在那里读到了。所以制表符补全有效,至少它在这里适用于文件路径。你不会得到程序完成,它知道第一个参数应该是 PATH 中的可执行文件,第二个参数应该是文件,等等。也许也有一些方法可以得到它,但它会更难。无论如何,您仍然可以获得简单的文件路径完成。
    • 我的 bash 不知道 -i 并且我无法运行该示例。但是我可以使用完成,但给定的“参数”消失了。基于初始简单示例的完整示例如何,我想将“ls *.jpg”更改为“ls *.png”?
    【解决方案2】:

    您的别名上有一些 cmets:

    简化引用:

    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'
    

    【讨论】:

    • 你对 ac 的简化是正确的。我把原来的帖子改了。 rc 必须保持原样,因为您想要的引用在这里不起作用 - 试试看。 sc 也无法通过丢弃 $IFS 来优化,因为如果 ~/.commands 中的行中有空格,它会破坏数组。
    • @tuner07:+="${text[@]}"select 语句中的引用消除了对IFS 的需要,并且仍然处理命令中的空格。我确实尝试了rc 我的方式。反斜杠避开了美元符号,从而消除了对额外引号的需要。尝试scrc 进行我的更改。他们工作。
    【解决方案3】:

    @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  
    

    【讨论】:

    • 当然读起来更好。但这不是我的兴趣 ;-) 事实上,它应该尽可能简短和容易,以便我可以从我的 MidpSSH JavaME shell 轻松设置它。对这个问题有什么建议吗?
    【解决方案4】:

    也许你可以使用 preexec.bash?

    http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

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

    干杯,

    喜欢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多