Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从文件中读取带有glob的参数列表_Bash_Unix_Xargs_Glob - Fatal编程技术网

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