TL;DR 我正在编写一个非常简单的 bash 脚本,该脚本进入我的 pwd 中的每个文件夹并查找名称为 的文件pid
。如果是,则回显该文件。
pids=$(cat */*/bin/*pid)
echo $pids
>> 3742031 3741375 3741415 3742159
PID 打印得很漂亮,带有空格
我稍微更改了这段代码以在路径中查找 PID:
pids=$(cat */*pid)
echo $pids
>> 37410543741078
请注意,这次打印时没有空格。现在所有这些文件都是由应用程序自动生成的,因此存储这些值的方式必须一致 - 有或没有等\n
。
我的问题是几乎相同的代码,为什么在一种情况下它将字符串与空格连接起来,而在另一种情况下没有空格,如何才能获得与 cat 更一致的行为? (不是回声)。
添加解决方法:
无论文件如何,我都会在读取文件之前附加一个空格,例如: sed '$s/$/ /' */pid。这样就解决了问题。
答案1
查找文件的最佳方法是find
命令。例如:
for file in $(find / -type f -iname "*.pid"); do echo "$file = `cat $file | tr -d '\n'`"; done
必须使用双引号来显示字符串变量的内容。否则,任何类似Shell命令的特殊字符(如运算符)或字符串都可以被理解为真正的Shell命令,当然会在Shell中“执行”。
在第一种情况下,您搜索了目录,其中发现“.pid”文件包含一个特殊字符(Unix 换行代码、换行代码,也称为 LF 代码)。但是,在搜索的第二种情况下,“.pid”文件末尾不包含特殊的换行符(文件仅包含数字作为字符串 - 并且不以换行符结尾)。尝试在十六进制编辑器中查找并打开提到的“.pid”文件并检查最后一个字符。文件的内容可能因末尾的 LF 代码(0A
十六进制)而异。
有些“.pid”文件包含此 LF 代码,有些则不包含。这取决于文件的创建方式。例如,标准echo
命令通常还会在行尾添加此 LF 代码。但是,您也可以使用-n
参数,该参数不会将此 LF 代码添加到 echo 命令输出的末尾:
root@formuler3ip:~# echo "666" > /tmp/test1
root@formuler3ip:~# echo -n "666" > /tmp/test2
root@formuler3ip:~# xxd -g 1 /tmp/test1
00000000: 36 36 36 0a 666.
root@formuler3ip:~# xxd -g 1 /tmp/test2
00000000: 36 36 36 666