【问题标题】:Why does this one-line function work in zsh but not bash, and how can I fix it for bash?为什么这个单行函数在 zsh 中有效而在 bash 中无效,我该如何为 bash 修复它?
【发布时间】:2014-12-11 23:16:08
【问题描述】:

我在研究如何表达问题时找到了答案,但它可能对某人有用。我使用 zsh 并且我的 .zshrc 和我的 .bashrc 都有 source $HOME/.alias 在其中。这是旧的、有问题的~/.alias

rl() { grep -v "$1" "$2" > /tmp/rl.txt && mv /tmp/rl.txt "$2" }
...

它在 zsh 中运行良好,但在 bash 中出现意外的文件结束错误,并且 rl 未定义。

【问题讨论】:

    标签: linux bash zsh


    【解决方案1】:

    在 zsh 和 bash 中都可以使用的固定 ~/.alias

    rl() { grep -v "$1" "$2" > /tmp/rl.txt && mv /tmp/rl.txt "$2"; }
    ...
    

    Bash 只需要在单行函数声明中的最后一个命令后加一个分号。

    【讨论】:

    • 顺便说一下,上面定义的rl是这样使用的:rl someword somefile.txt,它会从“somefile.txt”中删除包含“someword”的行。
    • sed -i -e '/someword/d' somefile.txt 将删除文件 somefile.txt 中所有出现 someword 的行(-i 选项)跨度>
    【解决方案2】:

    您可以在函数中使用sed 来避免复制文件然后将其移动到原始文件上。

    rl() { sed -i -e "/$1/d" "$2"; }
    

    -i 标志在原地编辑文件文件,并进行备份如果您提供了扩展名。没有扩展,它只是就地编辑。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2019-01-03
      • 2013-11-29
      相关资源
      最近更新 更多