1729495819
2024-10-21 06:41:00
コマンドラインでファイルの内容を表示したいとします。私たちのほとんどが最初に手を伸ばすツールは、 cat、これだけで素晴らしい仕事をします。しかし、Linux マシン上でファイルを cat しようとするとどうなるでしょうか。
$ cat file.txt
-bash: cat: command not found
または:
$ cat file.txt
bash: fork: retry: No child processes
この投稿では、このアイデアを検討し、これの特徴を説明します チャレンジ シェルの外部のユーティリティを使用せずにファイルの内容を表示する必要がある場合。
シェルの組み込み、リダイレクト、サブシェルの使用
シェル組み込みの使用 read 新しいプロセスをフォークせずに、ファイルの内容を表示できます。
while read line; do
echo $line;
done
ヘルプページより read:
標準入力、または -u オプションが指定されている場合はファイル記述子 FD から 1 行が読み取られ、最初の単語が最初の NAME に割り当てられます。
この例では、file.txt の内容が次の STDIN にリダイレクトされます。 read、ファイルの終わりに達するまで入力を 1 行ずつ処理します。 read STDIN の代わりにファイル記述子を入力として受け取ることもできるため、これも機能します。
exec 3# Assign file descriptor 3 for reading
while read -u 3 line; do
echo $line
done
これでは、単に入力するだけではなく、はるかに多くの入力作業が必要になります。 cat file.txt。と bash または zsh を使用せずにファイルの内容を表示する別の方法があります。 cat:
この方法はリダイレクトとコマンド置換を使用しており、bash のマニュアル ページで説明されています。
コマンド置換 $(cat file) は、同等で高速な $( に置き換えることができます。
猫をフォークしていないため、処理が速くなりますが、それは重要ですか?おそらくそうではなく、何をしているのか誰にも明確ではないかもしれませんが、シェルで簡単なテストを行うと違いがわかります。
$ time for n in {1..1000}; do \
echo $(/resolv.conf) >/dev/null; \
done
real 0m0.977s
user 0m0.380s
sys 0m0.604s
$ time for n in {1..1000}; do \
cat /etc/resolv.conf >/dev/null;
done
real 0m1.980s
user 0m0.626s
sys 0m1.224s
この構文 $(file.txt STDIN に送信され、STDOUT としてエコーされます。を使用したリダイレクトについてもう少し詳しく知りたい場合は、 > そして see my earlier post about shell redirection.
他のユーティリティの使用
他のオプションはどうですか?シェル組み込みを使用せずに、代わりに他の標準ユーティリティを使用して、cat なしで cat を実行することもできます。
ul ファイル内の一部の単語に誤って下線を引いてしまう可能性がありますが、これが 2 文字だけのファイルを cat する唯一の方法かもしれないと思います。
まだ推測していない場合は、 tac は、GNU コア ユーティリティの逆です。 cat したがって、賢明にしたい場合は、次の出力をパイプすることができます tac に tac それはただの cat。
もちろん次のようなツールを使用します sed、 perl、 python、などを使用すると、ファイルを猫化することもできます。幸せな猫化を!
猫を使わずに猫を飼う他の方法に興味がありますか?試してみてください おっとチャレンジ!
#コマンドラインに猫のいない猫