特定のファイルのリストを予想変数に保存しようとしています。
私のスクリプトでは、.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 *.foo
。awk
このパターンが見つかりました... with(一重引用符)を使用すると、かつらが予想されるため、およびを使用する考えがfind
ほとんどなくなります。'
使用してもファイルが存在しない場合、スクリプトは停止します。引き続き別のファイルを確認して一覧表示する必要があります。find
awk
grep
ls -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] }