トラスパラメータで直接結合コマンドを使用すると、問題なくうまく機能します。
ただし、結合コマンドの定義済み変数を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
シェルは、、、およびtruss
4つのパラメータで実行されます。そこに行くパイプは、引数の一部ではなく、シェルが同時に実行され、標準出力が標準入力に接続されるようにする特別なシェル構文です。出力がパイプに入るのを見る以外はそこにあることはわかりません。-adefo
/tmp/not_a_term.out
ls
-ltr
head
truss
head
truss
truss
head
truss
head
他のコマンドから:
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
オプション文字が認識されないことがわかりました。truss
ls
ls
|
シェル構文の変数の内容を解釈するには、を実行して実行する必要があります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
答え2
最後に、同様の需要機能は、これらの複数の結合コマンドを含むスクリプトを介して実行する必要があることを発見しました。
注:trussコマンドは、argcとして複数の「内部」コマンドを許可するのではなく、一度に1つの「外部」コマンドのみをargvとして許可するようです。
#
#
# 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
#
#
# wc -l /tmp/not_a_term.out
595 /tmp/not_a_term.out
#
#
# grep head /tmp/not_a_term.out
#
#
# grep -E "arg|execve" /tmp/not_a_term.out
25296928: 0.0000: execve("/usr/bin/ls", 0x2FF22C6C, 0x200132F8) argc: 2
25296928: 64291025: argv: ls -ltr
#
#
#
# echo "ls -ltr|head >t_2 2>&1" > l_h.sh
#
#
# cat l_h.sh
ls -ltr|head >t_2 2>&1
#
#
# chmod 744 l_h.sh
#
#
# truss -adefo /tmp/not_a_term.out ./l_h.sh
#
#
# grep -E "arg|execve" /tmp/not_a_term.out
28377090: 0.0000: execve("./l_h.sh", 0x2FF22C70, 0x200132F8) Err#8 ENOEXEC
28377090: 69468411: 0.0138: execve("/usr/bin/sh", 0xF07F8558, 0x200132F8) argc: 3
28377090: 69468411: argv: sh -- ./l_h.sh
25165906: 60555303: 0.0408: execve("/usr/bin/ls", 0x200117A8, 0x200117D8) argc: 2
25165906: 60555303: argv: ls -ltr
25165906: 60555303: 0.0486: execve("/usr/bin/head", 0x200117A8, 0x200117D8) = 0xD0539130 argc: 1
27131920: 64553157: argv: head
#
#