Ubuntu使用zsh,现在有了 alias
alias | grep sayhi
sayhi='echo hi'
sayhi foo
hi foo
Run Code Online (Sandbox Code Playgroud)
但是,我不能用这个alias在xargs或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在这种情况下使用呢?
撇开您正在处理两个不同的 shell 的事实不谈:
xargs只能调用外部实用程序(可执行文件),因此根据定义它不能(直接)调用别名。
管道传输将在不知道当前 shell 别名的子bash进程中运行(默认情况下,非交互式 Bash 实例既不会读取常用的配置文件/初始化文件,也不会扩展别名)。
虽然您可以使其与许多使调用变得非常复杂的扭曲一起工作,但最好的选择是将别名转换为脚本并拥有xargs/bash调用它。
要获得与使用别名相同的单字调用体验:
创建脚本sayhi(没有文件名后缀);示例内容,取自您的后续问题:
#!/bin/bash
echo hi $@
Run Code Online (Sandbox Code Playgroud)使其直接可执行:chmod +x sayhi- 这样您就不必涉及 shell 可执行文件来调用它。
$PATH。然后,您将能够像路径中的任何其他可执行文件一样调用您的脚本 - 仅通过文件名 - 并且您的问题中的示例命令应该可以工作。