相关疑难解决方法(0)

了解 IFS

本站点和 StackOverflow 上的以下几个线程有助于理解IFS工作原理:

但我还有一些简短的问题。我决定在同一篇文章中问他们,因为我认为这可能有助于更好的未来读者:

一季度。 IFS通常在“字段拆分”的上下文中讨论。是场分裂一样的分词

Q2: POSIX 规范

如果IFS 的值为空,则不进行字段拆分。

设置IFS=是否与设置IFS为空相同?这也是将其设置为 an 的意思empty string吗?

Q3:在 POSIX 规范中,我阅读了以下内容:

如果没有设置 IFS,shell 的行为就像 IFS 的值是 <space>, <tab> and <newline>

假设我想恢复IFS. 我怎么做?(更具体地说,我如何引用<tab><newline>?)

Q4:最后,这段代码如何:

while IFS= read -r line
do    
    echo $line
done < /path_to_text_file
Run Code Online (Sandbox Code Playgroud)

如果我们将第一行更改为

while read -r line # Use …
Run Code Online (Sandbox Code Playgroud)

shell

83
推荐指数
3
解决办法
11万
查看次数

在 find -exec 调用中执行用户定义的函数

我在 Solaris 10 上使用 ksh (88)、bash (3.00) 和 zsh (4.2.1) 测试了以下内容。

以下代码不会产生任何结果:

function foo {
    echo "Hello World"
}

find somedir -exec foo \;
Run Code Online (Sandbox Code Playgroud)

这一发现不匹配多个文件(如更换-exec ...-print),并从外面叫时功能完美的作品find调用。

以下是该man find页面的内容-exec

 -exec command 如果执行的命令返回一个,则为真
                     零值作为退出状态。结尾
                     命令必须以转义字符作为标点
                     分号 (;)。命令参数 {} 是
                     替换为当前路径名。如果
                     -exec 的最后一个参数是 {} 而你
                     指定 + 而不是分号 (;),
                     命令被调用的次数更少,
                     {} 替换为路径名组。如果
                     命令的任何调用都会返回一个
                     非零值作为退出状态,找到
                     返回非零退出状态。

我可能会做这样的事情:

for f in $(find somedir); do
    foo
done
Run Code Online (Sandbox Code Playgroud)

但我害怕处理字段分隔符问题。

是否可以从调用中调用 shell 函数(在同一个脚本中定义,让我们不要理会范围问题)find ... -exec ...? …

solaris ksh find shell-script function

35
推荐指数
4
解决办法
3万
查看次数

如何在 find 命令的 -exec 中使用两个 bash 命令?

是否可以在command-exec部分使用 2 个命令find

我试过这样的事情:

find . -name "*" -exec  chgrp -v new_group {}  ; chmod -v 770 {}  \;
Run Code Online (Sandbox Code Playgroud)

我得到:

查找:缺少 -exec
chmod 的参数:无法访问 {}:没有这样的文件或目录
chmod:无法访问;:没有这样的文件或目录

bash find

33
推荐指数
3
解决办法
3万
查看次数

逐行处理命令输出,不混合标准输入

所以,我有一个与Bash非常相似的问题:如何从命令的输出中一次读取一行?, 我在做:

while read path; do mplayer $path; done < <(find-me-random-mp3s)
Run Code Online (Sandbox Code Playgroud)

或者

find-me-random-mp3s | while read path; do mplayer $path; done
Run Code Online (Sandbox Code Playgroud)

该命令find-me-random-mp3s在一个新行上输出每个文件路径。问题在mplayer运行时开始,它开始消耗find-me-random-mp3s输出中的行,即应该path在每次迭代时填充在变量内的行。

我继续这个肮脏的修复:

find-me-random-mp3s | while read path; do cat /dev/null | mplayer $path; done
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢它,它也阻止了我与 mplayer 的终端交互。

在这种情况下,我可以使用任何替代方法吗?

shell bash pipe stdin

5
推荐指数
2
解决办法
1305
查看次数

标签 统计

bash ×2

find ×2

shell ×2

function ×1

ksh ×1

pipe ×1

shell-script ×1

solaris ×1

stdin ×1