使用文件中的glob读取参数列表

DPM*_*DPM 1 unix bash glob xargs

我试图ll从文件中读取命令的参数.我有args.txt内容文件some?.我所拥有的文件与名称some1,some2以及some3和其他一些文件.当我执行时,cat args.txt | ll我获得与执行时相同的结果ll.

有人可以解释我为什么会这样,我怎样才能达到预期的效果.提前致谢.

mkl*_*nt0 5

注:我假设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?存在) -没有通配发生,因为没有壳参与.