GNU/Linux >> Linux の 問題 >  >> Linux

別のコマンドの単一引用符と二重引用符を含むコマンドをラップしますか?

最近時計について学びましたが、比較的洗練されたコマンドで時計を動作させるのに問題があります。

たとえば、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で引用符で囲むか、囲まないか。
Linux
  1. コマンド単一引数の最大サイズを定義するものは何ですか?

  2. シェルダブル対の良いニーモニックは何ですか。一重引用符?

  3. sedで一重引用符を別の文字に置き換えるにはどうすればよいですか?

  1. 一重引用符と二重引用符の両方を含む bash エイリアス コマンド

  2. Linux のダブル ドット (..) とシングル ドット (.) とは何ですか?

  3. 用語をgrepして別の用語を除外する

  1. コマンドと出力の異なる色

  2. man ページを開き、1 つのコマンドで文字列を検索する

  3. アンダースコアをコンマに置き換え、CSV で二重引用符を削除する