複雑なcmd、引用符、およびcmdパラメータを持つtcshエイリアス

複雑なcmd、引用符、およびcmdパラメータを持つtcshエイリアス

パイプで接続されたコマンドのエイリアスセットをバインドし、ここでいくつかのスレッドを調べた結果、cmd行を異なる方法で使用する必要があることがわかりました。 $1の代わりに!:1を使用しますが、次の状況では動作しないようです。

これはエイリアスを指定したい一連のコマンドです(中央値を計算します)。

shell>  cat file_with_numbers| awk '{print $1}' | sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
shell> 1.15

以下のセクションのエイリアスを「中央値」として指定したいと思います。

sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'

だから私は使用できます

shell> cat file_with_numbers| awk '{print $1}' | median

alias median 'sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }''

()位置が悪い。 //一重引用符エラー

alias median "sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"

cat file| awk '{print $5}'|  median
awk:  { a[i++]=; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }
awk:           ^ syntax error

\!:1だから私は次に切り替えてみましたが、それでも機能しません。このエイリアスを正しく使用するにはどうすればよいですか?

1>テスト1

alias median "sort -n | awk ' { a[i++]=\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "


cat file|  awk '{print $5}' | median
Bad ! arg selector.

2>テスト2

alias median "sort -n | awk ' { a[i++]=\\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "

cat file| awk '{print $5}' | median
awk:  { a[i++]=!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }
awk:            ^ syntax error

テスト3>

ベストアンサー1

一連の1行コマンドをエイリアスに入れることができますが、そこにバックスラッシュと一重引用符または二重引用符を追加する必要があるかもしれません。ただし、シェル履歴の引数または要素を使用してエイリアスを呼び出す必要がある場合や速度を最大化する必要がない場合は、コマンドシーケンスをそのままファイルに配置し、実行可能とマークされてからファイルに配置する方が簡単です。ファイルのどこかにあります。検索パス($PATHまたは$path)。

しかし、以下をエイリアスとして作成します。

sort -n | awk '{ a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'

あなたは確かにする必要があります

  • パイプ演算子は引用符付き文字列内にあります。それ以外の場合、エイリアスコマンドは終了します。
  • theは$一重引用符で囲まれた文字列の内側、またはaが前の引用符で囲まれた文字列の外側にあります\(代替案を提供したStéphaneに感謝します)。
  • 入れ子になった単一引用符なし

\!:1プロダクションを試すために使用しないでください$1\!:1パラメーターを別名に渡すと、そのパラメーターが使用されます。あなたは$1awkがテキストを見ることを望みます。

この場合、最も安全な方法は、できるだけ多くのエイリアスを一重引用符で囲み、リテラルを囲むために"一重引用符のみを使用することです。次の内容が2回表示されることがあります"'"

ubuntu% alias median 'sort -n | awk '"'"'{ a[i++]=$1 ; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }'"'"

ubuntu% seq 1 9 | median
5

おすすめ記事