Linux 'cat'の内部の仕組み

Linux 'cat'の内部の仕組み

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コードを追加します。ただし、-nechoコマンドの出力の末尾にこの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

おすすめ記事