我怎么能在 xargs 中使用别名

How could I use alias in xargs

Ubuntu 使用 zsh,现在有一个 alias

alias | grep sayhi
sayhi='echo hi'

sayhi foo
hi foo

但是,我无法在 xargs 或 bash 中使用此 alias,请参阅下文

➜  ~  echo foo | xargs -i sayhi {}
xargs: sayhi: No such file or directory
➜  ~  echo foo | awk '{print "sayhi "[=11=]}'
sayhi foo
➜  ~  echo foo | awk '{print "sayhi "[=11=]}'|bash
bash: line 1: sayhi: command not found

看来我不能在命令行中间接使用alias

那么在这种情况下我该如何使用 alias

抛开你正在处理 两个不同的 shells:

  • xargs 只能调用 外部实用程序(可执行文件),因此根据定义它不能(直接)调用别名。

  • 管道连接到 bash 将 运行 在一个 child 进程中,该进程不知道您当前的 shell别名(默认情况下 non-interactive Bash 实例既不会读取通常的配置文件/初始化文件,也不会扩展别名)。

虽然您可以使它与许多使调用复杂化的扭曲一起工作,但最好的选择是将您的别名转换为 script 并且让 xargs / bash 调用它。

要获得与别名相同的 single-word 调用体验:

  • 创建脚本sayhi(没有文件名后缀);示例内容,取自您的 follow-up 问题:

    #!/bin/bash
    echo hi $@
    
  • 使其直接可执行:chmod +x sayhi - 这样你就不必涉及shell可执行文件来调用它.

  • 将其放在 $PATH 变量中列出的目录中。

然后您将能够像路径中的任何其他可执行文件一样调用您的脚本 - 仅通过文件名 - 并且您问题中的示例命令应该有效。