
ファイル名を に渡すための、互換性のあるエレガントな方法を探していますentr
。以下は Bash で動作することはわかっていますが、他のシェルでも動作するコマンドが欲しいです。
(entr
は、ファイルを監視し、起動時およびファイルが変更されたときにコマンドを実行するプログラムです。ドキュメントにはls *.ext
、たとえば、がパイプで渡されると記載されています。つまり、改行で区切られた正当なファイル名のリストがパイプで渡されることを期待しています。不正なファイル名については警告を発します。)
マルチライナー
このコマンドを使用すると、複数行の herestring を使用して特定のファイルを一覧表示できます。
$ entr echo "command ran" <<< "
> filename1
> filename2
> "
引用符と、それらを別々の行にリストする必要があることが煩わしいと思います。また、簡単に検索すると、Bash 以外のシェルでは機能しない可能性があることがわかります。
インタラクティブを使用できますcat
:
$ cat | entr echo "command ran"
filename2
filename2
しかし、毎回改行する必要があり、エラーの余地があまりなく、Ctrl-D最後に慎重に入力する必要があります。
ヒアドキュメントも同様に機能しますが、ブックエンド構文が含まれます。
$ cat << EOF | entr echo "command ran"
> filename1
> filename2
> EOF
ワンライナー:
ls
一見良さそうな も実行できます:
$ ls filename1 filename2 | entr echo "command ran"
しかし、ls
スペルミスのある名前は削除され、entr
不適切な名前は検証されて警告されるため、この方法で ls を呼び出すことによる副作用が心配です。
にパイプする前に、echo
と をパイプできます。tr
entr
$ echo filename1 filename2 | tr " " "\n" | entr echo "command ran"
しかし、余分なコマンドがたくさんあるのは好きではありません。
質問:
ほとんどの (できればすべての) シェルで動作する、短くてエレガントなコマンドを作成するにはどうすればよいでしょうか。POSIX で想定される構文が理想的です。
答え1
entr
各ファイルを別々の行に置きたいようですが、かなり制限があります。持っているtr
各ファイル名を別々の行に記述します。区切り文字がファイル名の一部である場合 (「これはファイル名です」)、1 行に記述しようとすると (例: ) 失敗します。
私はただシンプルに
echo 'filename 1
filename2' | entr echo "command ran"