트러스 매개변수에서 직접 결합 명령을 사용하면 문제 없이 잘 작동합니다.
그러나 결합된 명령의 사전 정의된 변수를 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로 허용하는 대신 한 번에 하나의 "외부" 명령만 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
#
#