注:我假设ll是一个别名为ls -l或一些变化.
正如Charles Duffy指出的那样,(默认情况下)只有交互式shell知道别名,脚本以及诸如xargs不知道它们的工具.
通过管道向命令发送的内容是通过其stdin流接收的,这与命令的参数(诸如-l和操作数等选项some?)不同.
因此,需要进行显式转换才能将文件内容转换为args.txt可传递给的参数ls -l:
ls -l $(cat args.txt) # In Bash you can simplify to: ls -l $(< args.txt)
Run Code Online (Sandbox Code Playgroud)
请注意,命令substitution($(...))是故意不加引号,以确保根据需要将globbing(文件名扩展)应用于内容args.txt.
你的是一种罕见的情况,实际上需要这种脆弱的技术.
为了说明脆弱性:例如,如果您的通配模式是"some file"?(您需要将模式的双引号仍然被识别为单个参数),该命令将不再起作用,因为"字符会在以后失去其语法功能它们是命令替换(或变量扩展)的结果.
用于将stdin或文件内容转换为参数xargs的标准实用程序是.但是,在您的特定情况下,它不是一个选项,因为您的文件包含必须由shell扩展的glob(文件名模式),但只调用外部实用程序,而不涉及shell:xargs
$ xargs ls -l < args.txt # !! Does NOT work as intended here.
ls: file?: No such file or directory
Run Code Online (Sandbox Code Playgroud)
文件名file?是通过字面来ls(没有实际命名的文件file?存在) -没有通配发生,因为没有壳参与.