我怎么能在xargs中使用别名

zhu*_*wei 5 shell zsh

Ubuntu使用zsh,现在有了 alias

alias | grep sayhi
sayhi='echo hi'

sayhi foo
hi foo
Run Code Online (Sandbox Code Playgroud)

但是,我不能用这个aliasxargs或bash,见下文

?  ~  echo foo | xargs -i sayhi {}
xargs: sayhi: No such file or directory
?  ~  echo foo | awk '{print "sayhi "$0}'
sayhi foo
?  ~  echo foo | awk '{print "sayhi "$0}'|bash
bash: line 1: sayhi: command not found
Run Code Online (Sandbox Code Playgroud)

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

那么我怎么能alias在这种情况下使用呢?

mkl*_*nt0 4

撇开您正在处理两个不同的 shell 的事实不谈:

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

  • 管道传输将在不知道当前 shell 别名的bash进程中运行(默认情况下,非交互式 Bash 实例既不会读取常用的配置文件/初始化文件,也不会扩展别名)。

虽然您可以使其与许多使调用变得非常复杂的扭曲一起工作,但最好的选择是将别名转换为脚本拥有xargs/bash调用它。

要获得与使用别名相同的单字调用体验:

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

    #!/bin/bash
    echo hi $@
    
    Run Code Online (Sandbox Code Playgroud)
  • 使其直接可执行:chmod +x sayhi- 这样您就不必涉及 shell 可执行文件来调用它。

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

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