事前定義されたいくつかの変数に結合されたコマンドを結び付けるには?

事前定義されたいくつかの変数に結合されたコマンドを結び付けるには?

トラスパラメータで直接結合コマンドを使用すると、問題なくうまく機能します。

ただし、結合コマンドの定義済み変数をtrussパラメーターに間接的に使用すると失敗します。

# 
# truss -adefo /tmp/not_a_term.out  ls -ltr|head
total 233888
drwx------    2 root     system          256 Feb 22 2017  lost+found
-rw-r--r--    1 root     system          406 Feb 22 2017  .sr_migrate.log
-rw-------    1 root     system            0 Feb 22 2017  .strload.mutex
-rw-r--r--    1 root     system          708 Feb 22 2017  ctrmc_MDdr.dbg
-rw-r--r--    1 root     system          708 Feb 22 2017  IBM.CSMAgentRM_dr.sh.dbg
-rw-r--r--    1 root     system         9114 Feb 23 2017  .tzlist
d-w-------    2 root     system          256 Feb 23 2017  saved_errmbatch
d-w-------    2 root     system          256 Feb 23 2017  errmbatch
-rw-r--r--    1 root     system          179 Feb 23 2017  mirror_1.out
#            
# 
# 
# A1="ls -ltr|head"                             
# 
# 
# truss -adefo /tmp/not_a_term.out  $A1         
ls: Not a recognized flag: |
ls: Not a recognized flag: h
Usage: ls [-1ACFHLNRSabcdefgiklmnopqrstuxEUX] [File...]
# 
# 

ベストアンサー1

あなたは書く

トラスパラメータで直接結合コマンドを使用する場合

しかし、これは誤解を招くようです。コマンドから:

truss -adefo /tmp/not_a_term.out  ls -ltr|head

シェルは、、、およびtruss4つのパラメータで実行されます。そこに行くパイプは、引数の一部ではなく、シェルが同時に実行され、標準出力が標準入力に接続されるようにする特別なシェル構文です。出力がパイプに入るのを見る以外はそこにあることはわかりません。-adefo/tmp/not_a_term.outls-ltrheadtrussheadtrusstrussheadtrusshead

他のコマンドから:

truss -adefo /tmp/not_a_term.out  $A1    

パイプはありません。代わりに、シェルはtruss引数と-adefo拡張および分割された/tmp/not_a_term.outすべての項目を使用して実行されます。を$A1使用すると、A1="ls -ltr|head"パラメータ-adefo/tmp/not_a_term.outが生成されますls。ついに起動したときに-ltr|headオプション文字が認識されないことがわかりました。trusslsls|

シェル構文の変数の内容を解釈するには、を実行して実行する必要がありますeval

A1="ls -ltr|head"
eval "truss -adefo /tmp/not_a_term.out $A1" 

truss -adefo /tmp/not_a_term.out ls -ltr|head上記の最初のコマンドと同様に、最初にシェルに展開され、次に解析されます。

追加の解析手順のためにデータを正しく引用するように注意する必要があります。たとえば、ファイル名を変数に保存すると、名前に含まれるすべてのシェル構文が解析されます。考慮する:

file='$(date >&2)'
touch "$file"
# you now have a filename with a literal $ in it
# this runs 'ls' on the file
ls -ld "$file"
# this runs 'date' and 'ls -ld'
eval ls -ld "$file"

特定の要件に応じて、いくつかのコマンドに対してtrussを実行し、出力をヘッドにパイプする関数を作成できます。たとえば、次は同じパイプを実行します。

trusshead() {
    outfile=$1
    shift
    truss -adefo "$outfile" "$@" | head
}
trusshead /tmp/not_a_term.out ls -ltr

おすすめ記事