web-dev-qa-db-ja.com

edで<< \ ENDが使用される理由

edを使用して、ファイル#の10行目から20行目の先頭に文字/etc/passwdを配置します。解決策は次のとおりです

ed /etc/passwd <<\END
10,20s/^/#/
%p
Q
END

私の質問は、ここで<<が何を意味し、ENDの前に\が何を意味するのか、そしてなぜそれを使用するのかということです。いつも使う必要がありますか?

1
Somojel

表示しているのは、編集スクリプトと一緒に使用されているedです。

編集スクリプト(一連のedコマンド)は、ヒアドキュメントとしてedに渡されています。ヒアドキュメントは、ユーティリティの標準入力への、場合によっては複数行のテキストの一部ですリダイレクト。ヒアドキュメントは、最初と最後のENDマーカーの間にあるものです。最初のENDマーカーの前にある\は、ドキュメントが引用されていることを意味します。つまり、シェルはその中の変数などを展開しようとしません。 <<'END'と書くこともできます。この特定の例では、編集スクリプトにはシェルが展開するものが含まれていないため、\を削除できます。

これは、より単純な非対話型編集のためにedを使用する一般的な方法ですが、この方法で使用する場合はed-sオプションとともに使用する必要があります。

このコマンドは、実際にはsedを使用するのと同じです。

sed '10,20/^/#/' /etc/passwd

edスクリプトはファイルに変更を加え、終了する前にターミナルにファイルを表示しますなし変更を保存します。これは多かれ少なかれ上記のsedスクリプトは行ごとに実行されます)。


これはnot/etc/passwdファイルを編集する良い方法です(ただし、edスクリプトは変更を保存しないため、実際には実行していません)。そのためには、vipwのようなツール、またはこのファイルを変更するために作成された特定のコマンド(useraddなど)を使用する必要があります。これは、多くのUnixシステムでは、ファイルを1つまたは複数の他のファイルまたはデータベースと同期する必要があり、ファイルを編集するにはこれらも更新する必要があるためです(たとえば、vipwは自動的に行います)。

4
Kusalananda

それはedではなく、あなたのシェルです。

これは、Word ENDまで生の入力を受け取り、それをコマンドのSTDINに送信することを意味します。

例えば:

$ cat <<\END
> something
> END
something

次と同じ結果が生成されます。

$ echo something | cat
something
0