Heredoc을 사용하고 쉘 PID를 인용하는 명령 대체는 ksh와 bash 간에 다릅니다.

Heredoc을 사용하고 쉘 PID를 인용하는 명령 대체는 ksh와 bash 간에 다릅니다.

코헨 스크립트:

#!/bin/ksh
sqlplus -s / << EOF
define a=$(pgrep -P $$)
define a
!ptree &a
EOF

VS

쿵쿵 스크립트:

#!/bin/bash
sqlplus -s / << EOF
define a=$(pgrep -P $$)
define a
!ptree &a
EOF

Korn 쉘 출력(예상대로 작동하지 않음):

$ /tmp/testsql.ksh
SP2-0137: DEFINE requires a value following equal sign
SP2-0135: symbol a is UNDEFINED
Enter value for a:
SP2-0546: User requested Interrupt or EOF detected.

Bash 쉘 출력(예상대로 작동):

$ /tmp/testsql.bash
DEFINE A               = "2713" (CHAR)
  710 /usr/lib/ssh/sshd
   9574 /usr/lib/ssh/sshd -R
     9578 /usr/lib/ssh/sshd -R
.
.
.
                     2712 /bin/bash /tmp/testsql.sh
                       2713 sqlplus -s /
                         2717 ptree 2713

ksh 스크립트에서 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변1

다음으로 변경하세요.

(cat; exec ps -o pid,args) << EOF
$(ps -o pid,ppid,args -H)
EOF

무슨 일이 일어났는지 보세요.

을 사용하면 bash다음이 표시됩니다.

$ bash ./script
    PID    PPID COMMAND
 428458  428451 /bin/zsh
 976353  428458   bash ./script
 976354  976353     bash ./script
 976355  976354       ps -o pid,ppid,args -H
    PID COMMAND
 428458 /bin/zsh
 976353 bash ./script
 976354 ps -o pid,args
$ ksh93u+m ./script
    PID    PPID COMMAND
 428458  428451 /bin/zsh
 976559  428458   ksh93u+m ./script
 976560  976559     ps -o pid,ppid,args -H
    PID COMMAND
 428458 /bin/zsh
 976559 ksh93u+m ./script
 976562 ps -o pid,args

bash976354(의 하위 프로세스 ) 에서 $$하위 프로세스가 명령 대체를 실행한 ps다음 실행을 계속하도록 포크되는 ps반면, ksh에서는 명령 대체를 실행하는 프로세스가 ps기본 ksh 포크( $$)에 의해 처리되므로 더 많은 아침을 확인하세요.

pgrep -P "$$"스크립트를 해석하기 위해 셸을 실행하는 프로세스의 하위 항목을 나열합니다(그 자체는 아님). Bash에서는 이것이 결국 여러분을 실행할 프로세스를 포함하게 됩니다. sqlplus왜냐하면 bash이것이 바로 그것이기 때문입니다.

이렇게 하면 명령 대체 프로세스를 포그라운드 프로세스 그룹에 넣을 수 있으므로 대화형 셸에서 작업 제어가 더 쉬워지므로 Ctrl+C를 누르면 중단되고 대화형으로 ksh93을 찾을 수 있습니다. 리디렉션된 명령이 외부 명령인 경우 런타임 시.

그러나 ksh에 관한 한 런타임에는 실행 중인 프로세스 외에는 pgrep -P하위 프로세스가 없습니다 . 실행될 작업은 나중에 시작되므로 출력이 비어 있고 이에 대해 불평합니다.$$pgrepsqlpluspgrepsqlplusdefine=

실행할 프로세스의 pid를 define=<pid>제공하는 것이 요점이라면 보다 안정적인 접근 방식은 다음과 같습니다.sqlplus<pid>sqlplus

sh -c 'exec sqlplus -s / << EOF
define a=$$
define a
!ptree &a
EOF'

여기서 우리는 를 사용하기 때문에 이 새로운 인스턴스에서 를 실행할 프로세스가 있음 exec을 알 수 있습니다 .$$shsqlplus

관련 정보