我怎么能在xargs中使用别名

时间:2016-01-19 03:45:17

标签: shell zsh

Ubuntu使用zsh,现在有alias

alias | grep sayhi
sayhi='echo hi'

sayhi foo
hi foo

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

➜  ~  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

似乎我不能在命令行中间接使用alias

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

1 个答案:

答案 0 :(得分:3)

暂且不论你正在处理两个不同的shell

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

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

虽然可以使其适用于使调用复杂化的许多扭曲,但最好的办法是将别名转换为脚本并拥有xargs / { {1}}调用它。

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

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

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

  • 将其放在chmod +x sayhi变量中列出的目录中。

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