TL;DR 私はパスワードのすべてのフォルダに入り、名前がpid
。その場合、ファイルはエコーされます。
pids=$(cat */*/bin/*pid)
echo $pids
>> 3742031 3741375 3741415 3742159
PIDは空白で美しく印刷されます。
パスでPIDを見つけるためにこのコードを少し変更しました。
pids=$(cat */*pid)
echo $pids
>> 37410543741078
今回は印刷時に空白がないことに注意してください。これらのファイルはすべてアプリケーションによって自動的に生成されるため、これらの値の保存方法は一貫している必要があります\n
。
私の質問はほぼ同じコードです。ある場合は文字列をスペースで連結し、他の場合はスペースなしで連結するのはなぜですか。猫とより一貫した動作を得る方法は何ですか? (エコではない)。
回避策を追加してください。
ファイルに関係なく、ファイルを読み取る前にスペースを追加します(例:sed '$s/$/ /' */pid)。これで問題が解決します。
ベストアンサー1
ファイルを検索する最良の方法はfind
コマンドです。たとえば、
for file in $(find / -type f -iname "*.pid"); do echo "$file = `cat $file | tr -d '\n'`"; done
文字列変数の内容を表示するには、二重引用符を使用する必要があります。そうでなければ、シェルコマンドに似た特殊文字(演算子など)または文字列は実際のシェルコマンドとして理解され、もちろんシェルで「実行」されます。
最初のケースでは、ディレクトリを検索して ".pid"ファイルに特殊文字(Unix改行コード、改行コード、LFコードとも呼ばれる)が含まれていることを発見しました。ただし、検索の2番目のケースでは、「.pid」ファイルの末尾に特殊な改行文字は含まれていません(ファイルには数字だけが文字列として含まれており、改行文字では終わりません)。上記の「.pid」ファイルを16進エディタで見つけて開き、最後の文字を確認してください。ファイルの内容は、0A
最後のLFコード(16進数)によって異なります。
一部の ".pid"ファイルにはこのLFコードが含まれており、一部は含まれていません。ファイルの作成方法によって異なります。たとえば、標準echo
コマンドは通常、行の末尾にこのLFコードを追加します。ただし、-n
echoコマンドの出力の末尾にこのLFコードを追加しないパラメータを使用することもできます。
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