bash / zsh不执行" dmesg | lolcat"正确

时间:2018-03-15 11:07:01

标签: bash shell zsh

我想为每个可能的命令编写一个别名,并希望连接" | lolcat"它然后执行它。

到目前为止,我有:

     looool () {

      command=""
      for var in "$@"
        do
            command="$command $var"
        done

      command="$command | lolcat"

      $command
    }

我通过添加

进行测试
looool dmesg

作为最后一行。

Command as string是dmesg | lolcat,但到目前为止的输出是dmesg的帮助页面而不是所需的彩色dmesg。

先谢谢。

1 个答案:

答案 0 :(得分:3)

两个主要问题是:

  1. 将命令构建为一个这样的字符串会在很多情况下破坏参数(例如,如果其中一个包含空格或通配符)
  2. 执行" $ command"时,它不会将管道解释为分隔符,因为shell在扩展变量之前将该行拆分为命令,所以为时已晚使管道生效。你可以通过" eval"来解决这个问题,但上面的问题意味着这不是一个好主意。
  3. 为什么不做你

    it = (l[0] + i + last_value for i in range(3))
    *items, last = it # Now items is a tuple
    yield from items
    yield last
    yield from gen(l[1:], last)