Bash 从文件中读取带有glob的参数列表
我试图从文件中读取Bash 从文件中读取带有glob的参数列表,bash,unix,xargs,glob,Bash,Unix,Xargs,Glob,我试图从文件中读取ll命令的参数。 我有一个文件args.txt,内容some?。我有名为some1、some2和some3的文件以及其他一些文件。当我执行cat args.txt | ll时,得到的结果与执行ll时的结果相同 有人能解释一下为什么会这样,我怎样才能达到预期的效果。 提前感谢。您可以使用xargs将cat的输出传递给命令(ll): 如果args.txt包含多个由新行或空格分隔的值,xargs将分别传递每个值,执行命令的次数与args.txt中的条目相同: 例如,如果args.tx
ll
命令的参数。
我有一个文件args.txt
,内容some?
。我有名为some1
、some2
和some3
的文件以及其他一些文件。当我执行cat args.txt | ll
时,得到的结果与执行ll
时的结果相同
有人能解释一下为什么会这样,我怎样才能达到预期的效果。
提前感谢。您可以使用
xargs
将cat的输出传递给命令(ll
):
如果args.txt包含多个由新行或空格分隔的值,xargs
将分别传递每个值,执行命令的次数与args.txt中的条目相同:
例如,如果args.txt包含以下内容:
/var/
/usr/
/usr /var
然后执行的结果将如下所示:
$ cat args.txt | xargs ls
/usr:
bin etc games include lib lib64 libexec local sbin share src tmp
/usr/:
bin etc games include lib lib64 libexec local sbin share src tmp
/var:
adm cache crash cvs db empty games gopher kerberos lib local lock log mail nis opt preserve run spool tmp var yp
/var/:
adm cache crash cvs db empty games gopher kerberos lib local lock log mail nis opt preserve run spool tmp var yp
您可以使用
xargs
将cat的输出传递给命令(ll
,在您的情况下):
如果args.txt包含多个由新行或空格分隔的值,xargs
将分别传递每个值,执行命令的次数与args.txt中的条目相同:
例如,如果args.txt包含以下内容:
/var/
/usr/
/usr /var
然后执行的结果将如下所示:
$ cat args.txt | xargs ls
/usr:
bin etc games include lib lib64 libexec local sbin share src tmp
/usr/:
bin etc games include lib lib64 libexec local sbin share src tmp
/var:
adm cache crash cvs db empty games gopher kerberos lib local lock log mail nis opt preserve run spool tmp var yp
/var/:
adm cache crash cvs db empty games gopher kerberos lib local lock log mail nis opt preserve run spool tmp var yp
注意:我假设ll
是ls-l
的别名或一些变体。正如CharlesDuffy指出的,(默认情况下)只有交互shell知道别名,脚本以及诸如
xargs
之类的工具都不知道它们
通过管道发送到命令的内容通过其stdin流接收,该流不同于命令的参数(选项如-l
,操作数如some?
)
因此,需要显式转换,将文件args.txt
的内容转换为可以传递到ls-l
的参数:
ls -l $(cat args.txt) # In Bash you can simplify to: ls -l $(< args.txt)
文件名file?
被逐字传递到ls
(并且没有实际命名为file?
的文件存在)-没有发生全局绑定,因为没有涉及shell。注意:我假设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)
文件名
文件?
被逐字传递到ls
(并且没有实际命名为文件的文件?
存在)-没有发生全局绑定,因为没有涉及shell。下面的内容有些过火,但不管shell配置如何,都要努力做到正确和一致,并使用所有可能的文件名(即使是有空格的):
…之后用作(如果输入文件以换行符分隔):
tr'\n'\0'以下内容有些过火,但无论shell配置如何,都要努力做到正确和一致,并处理所有可能的文件名(即使是带有空格的文件名):
…之后用作(如果输入文件以换行符分隔):
tr'\n'\0'请注意,默认情况下,xargs
收集尽可能多的参数,以便方便地放在一行中,因此它通常执行命令的次数比输入中的条目少得多。有一些方法可以强制它对每个参数执行一个命令。这也会使文件名中带有空格。如果ll
是一个别名,那么xargs ll
不太可能工作。请注意,默认情况下,xargs
收集尽可能多的参数,以便方便地放在一行中,因此它通常执行命令的次数要比输入中的条目少得多。有一些方法可以强制它对每个参数执行一个命令。这也与f相冲突文件名中有空格。如果ll
是别名,则xargs ll
不太可能工作。@DPM,顺便说一句,ll
实际上不是一个UNIX命令。在一些系统上,它是一个现成的别名,但别名不是真正的命令——它只是一条指令,指示shell用不同的字符串替换前缀在解释命令之前;不是shell的程序(而xargs
就是这样的程序)不能识别别名,也不能运行它们。@DPM,顺便说一句,ll
实际上不是一个存在的UNIX命令。在一些系统上,它是一个现成的别名,但别名不是一个真正的命令——它只是一条指令,指示shell在解释命令之前用不同的字符串替换前缀;不是shell的程序(而且,xargs
就是这样一个程序)不识别别名,无法运行它们。想知道它是否适用于rc
?…如果是这样,Tom Duff可能会感到自豪;我想你们之间可能有某种遥远的关系。想知道它是否适用于rc
?…如果是这样,Tom Duff可能会感到自豪;我想我们之间可能有某种遥远的关系嗯,也许你们两个。
tr '\n' '\0' <args.txt | globfiles | xargs -0 ls -l --
globfiles <args.0sv | xargs -0 ls -l --