类似的构造IFS= read -r var
通常被视为 Bash 中将一行输入读入变量的“规范”方式(例如在 unix.SE 上)。
很明显,为什么设置一个空$IFS
通常可能是有益的,即控制(防止)分词。但是,我无法理解为什么在读入单个变量时具体需要这样做?bash 手册说:
如果单词数多于姓名,则剩余的单词及其中间分隔符将分配给姓氏
因此,即使不更改 IFS,如果read
传递单个变量,那么它最终不应该根据需要将整行保存到该变量中吗?$IFS
这种情况下设置空的原因是什么?
类似的构造IFS= read -r var
通常被视为 Bash 中将一行输入读入变量的“规范”方式(例如在 unix.SE 上)。
很明显,为什么设置一个空$IFS
通常可能是有益的,即控制(防止)分词。但是,我无法理解为什么在读入单个变量时具体需要这样做?bash 手册说:
如果单词数多于姓名,则剩余的单词及其中间分隔符将分配给姓氏
因此,即使不更改 IFS,如果read
传递单个变量,那么它最终不应该根据需要将整行保存到该变量中吗?$IFS
这种情况下设置空的原因是什么?
我尝试使用 GNU Parallel 为每个输入参数运行命令,使用该参数作为命令的工作目录(不将其附加到命令行)。
基本上,我需要做的是:
/foo -> "cd /foo; mycmd"
/bar -> "cd /bar; mycmd"
/baz -> "cd /baz; mycmd"
Parallel has--workdir
似乎可以通过支持{}
替换字符串来实现我想要的功能:
--workdir mydir
--wd mydir作业将在目录 mydir 中运行。默认值是本地计算机的当前目录,以及远程计算机的登录目录。
<...>
mydir 可以包含 GNU Parallel 的替换字符串。
为了防止参数被附加到命令行,我尝试使用-n0
or -N0
:
--max-args 最大参数
-n 最大参数每个命令行最多使用 max-args 个参数。
<...>
-n 0 表示读取一个参数,但在命令行上插入 0 个参数。
然而,这似乎不起作用:
$ mkdir -p $HOME/{foo,bar,baz}
$ printf '%s\n' $HOME/{foo,bar,baz} | parallel --workdir '{}' -n0 'pwd'
parallel: Error: Cannot change into non-executable dir : No such file or directory
请注意 之前的空格:
,这不是 GNU 并行中的拼写错误,而是表明 workdir 被评估为空字符串。如果我在 前面添加一个固定字符串{}
,这一点就会变得很明显,在这种情况下,所有 pwd 都会打印该固定字符串:
$ printf '%s\n' $HOME/{foo,bar,baz} | parallel --workdir '/{}' -N0 'pwd'
/
/
/
我究竟做错了什么?