以下を実行してみてください。
function which_terminal {
return (ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11)
}
さまざまな端末エミュレータに対してさまざまなテーマを設定できるように、端末エミュレータを実行している.zshrc内から変数を取得します。
コマンドラインでこれを実行すると、どのエミュレータが正確に使用されているかがわかります。ただし、ファイルに追加しようとすると、次のエラーが発生します。
which_terminal:1: no matches found: (ps -p16632 | awk 'NR==2' | cut -d ' ' -f 11)
誰かが助けることができれば、私がどこに間違っているかを見つけることができません。
答え1
シェルでは、関数の戻り値はコマンドの終了状態に似ています。成功(0)または失敗コード(> 0)を表す小さな整数値のみを返すことができます。
この状態はコマンドの出力とは関係ありません。コマンドを実行してその出力を変数に保存するには、次のようにします。コマンドの置き換え。関数内でコマンドを実行し、その出力を関数の出力として使用するには、コマンドを実行するだけです。
function which_terminal {
ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11
}
解析された出力はps
信頼できず過剰です。 (また、間違いです。'NR==2'
toawk
と' '
to を構文解析していますが、cut
どちらも無効な引数です。各引数の周りに一重引用符や二重引用符が必要です。どちらも必要ありません。)コマンドは、必要ps
なフィールドを印刷するオプションです。があります。たとえば、comm
実行可能ファイル名(Linuxでは16文字に切り捨て)、または引数を含む完全なargs
コマンドライン(呼び出し方法によってはコマンドのフルパスである場合があります)などがあります。
function which_terminal {
ps -p$PPID -o comm=
}
または、出力を変数に保存します。
parent_process_command=$(ps -p$PPID -o comm=)
エラーが発生する理由は、zshがreturn
コマンドの引数として次の内容を解析しようとするためです(ここでは引数キーワードですが、return
同じ方法で解析されます)。開き括弧を見て、それがワイルドカード式の始まりかどうかを判断します。このワイルドカード式はps -p16632
、awk 'NR==2'
または(ここではレンダリングされていない先行/末尾の空白を含む)というファイルと一致しますがcut -d -f 11
(驚くべきことに)その名前のファイルがないため、zshは一致するものを見つけることができないと文句を言います。現在ディレクトリにあるファイルを呼び出してreturn ?
いて3
、単一の文字名を持つ他のファイルがない場合は、3が返されます。