[exec ls -h | grep '\.foo']

[exec ls -h | grep '\.foo']

特定のファイルのリストを予想変数に保存しようとしています。

私のスクリプトでは、.foo、.barなどのさまざまなファイル拡張子を持つファイルをコンパイルしようとしています。

この例には、次のファイルがあります。

  • 何か。foo
  • 何か新しいもの。
  • その他のもの.bar
  • this_is_the_wrong_one.sh

.fooファイルのみを取得するには、次のコマンドを実行してみました。

set files "[exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev]"
send_user "$files\n"

私は次を見るのを楽しみにしています:

  • 新しいもの

ただし、最終的に次のエラー メッセージが表示されます。

子プロセスは異常終了します。
    実行時
"exec ls -h | grep -E '\.foo' | rev | cut -c5- | rev"
    内部で呼び出される
「設定ファイル」[exec ls -h | grep -E '\.foo' | grep -E '\.foo' |turn|cut-c5-|turn]""
    (ファイル「./runthis.sh」行2)

find '*.foo'、などが使用できることを知っていますls -h *.fooawkこのパターンが見つかりました... with(一重引用符)を使用すると、かつらが予想されるため、およびを使用する考えがfindほとんどなくなります。'使用してもファイルが存在しない場合、スクリプトは停止します。引き続き別のファイルを確認して一覧表示する必要があります。findawkgrepls -h *.foo

ファイルが見つかったら、最終的には次のように配列に分割されます。

アップデート1:

set split_files "[split $files \n]"

ベストアンサー1

問題は、一重引用符が特別なものではないため、通常はシェルから削除したい引用符を含むtcl実際にgrep引数を使用してコマンドを実行することです。'\.foo'

これは一致grepが失敗し、ゼロ以外のエラーコードで終了するため、コマンドはexecエラーを渡します。

簡単な答えはtcl二重引用符(grep -E "\\.foo")を使用するか、引用符なし(grep -E \\.foo)または中括弧引用符(grep -E {\.foo})を使用することです。しかし、別のオプションはシェルコマンドに依存しないことです。これに対応する内容はtcl次のとおりです。

set fullfiles [glob *.foo]
foreach f $fullfiles { lappend files [string trimright $f .foo] }

おすすめ記事