미리 정의된 일부 변수로 결합된 명령을 묶는 방법은 무엇입니까?

미리 정의된 일부 변수로 결합된 명령을 묶는 방법은 무엇입니까?

트러스 매개변수에서 직접 결합 명령을 사용하면 문제 없이 잘 작동합니다.

그러나 결합된 명령의 사전 정의된 변수를 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

답변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
# 
# 



관련 정보