最近時計について学びましたが、比較的洗練されたコマンドで時計を動作させるのに問題があります。
たとえば、watch
に質問したいのですが zsh
で次のコマンドを実行するには 3秒ごと:
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
ご覧のとおり、上の行には、他の特殊文字の中でも特に一重引用符、二重引用符が含まれています。
だから私は試しました:
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
しかし、それから私は得ました:
[メール保護]#$#….;でxに一致するものが見つかりません完了
私は他の組み合わせを試しましたが成功しませんでした。それらの試みの1つは次のとおりです。
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
これも同様のエラーになります。
これを機能させる方法について何かアイデアはありますか?
bash
で動作するソリューションにも興味があります
承認された回答:
一般的なヒント:ネストのレベルが2つある場合は、内側のコマンドで一重引用符を使用せず、外側のコマンドで一重引用符を使用してください。
追加のヒント:バッククォートを使用しないでください–`…`
–コードを実行するには、代わりに$(…)
を使用します その周りに。ネストされた引用符に関しては、ドル括弧はほとんどDWIM(「私が意味することを実行する」)です。バッククォートには、難解なシェル依存のルールがあります。
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
一重引用符で囲まれたコマンド内に一重引用符が必要な場合は、'''
を使用できます。 。これらの4文字は、一重引用符内で一重引用符を引用する方法と考えてください。ただし、技術的には、これは一重引用符で囲まれた文字列を終了し、リテラルの一重引用符を追加し、新しい一重引用符で囲まれた文字列を開始するように構成されます(現在の単語)。
より複雑なケースでは、引用符を入念に数えるか、一時変数を定義します。
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
この回答はzshに固有のものではありません。 Zshはここに大きなものは何ももたらしません。コマンドの置換を二重引用符で囲む必要がないため、引用符を少し節約できます。外部コマンドではなく組み込みコマンドを使用して引用符の必要性を減らす方法もありますが、根本的な問題は他のシェルと同じです。
ちなみに、watch
に注意してください sh
でコマンドを実行します 、zshではありません。 zshでコマンドを実行する場合は、実行する必要があります
watch -n 3 -x zsh -c "$cmd"
Debian / Ubuntu、および
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(さらに引用!)他の場所。
関連:変数の値をbashで引用符で囲むか、囲まないか。