( exec sh -i 3<<SCRIPT 4<&0 <&3 ⏎
echo "do this thing"
echo "do that thing"
exec 3>&- <&4
SCRIPT
)
exec $0.
또는 스크립트를 사용하여 더 잘 수행 할 수 있습니다. 또는 해당 파일 설명자 중 하나가 현재 사용되지 않는 터미널 장치를 지시하면 도움이 될 것입니다. 다른 프로세스도 해당 터미널을 확인하고 싶습니다.
그건 그렇고, 목표가 스크립트를 실행 한 후에 스크립트 환경을 보존하는 것이 목표라고 가정하면 훨씬 더 나은 서비스를 제공받을 것입니다.
. ./script
쉘의 .dot
와는 bash's source
하나도과 동일 - 쉘의가 .dot
이 거기가 될 것입니다 보장은 결코 비록, POSIX 특별한 쉘 내장으로 지정하고 가까운 당신이 얻을 수있는 보장되기 때문에입니다 ...
위의 내용은 문제가 거의 없지만 예상대로 수행해야합니다. 예를 들어 다음을 수행 할 수 있습니다.
( exec sh -i 3<<SCRIPT 4<&0 <&3 ⏎
echo "do this thing"
echo "do that thing"
$(cat /path/to/script)
exec 3>&- <&4
SCRIPT
)
쉘은 스크립트를 실행하고 대화식 프롬프트로 돌아갑니다- exit
스크립트에서 쉘 을 피 하거나 프로세스를 배경으로 하지 않는 한 i / o를/dev/null.
데모:
% printf 'echo "%s"\n' "These lines will print out as echo" \
"statements run from my interactive shell." \
"This will occur before I'm given the prompt." >|/tmp/script
% ( exec sh -i 3<<SCRIPT 4<&0 <&3
echo "do this thing"
echo "do that thing"
$(cat /tmp/script)
exec 3>&- <&4
SCRIPT
)
sh-4.3$ echo "do this thing"
do this thing
sh-4.3$ echo "do that thing"
do that thing
sh-4.3$ echo "These lines will print out as echo"
These lines will print out as echo
sh-4.3$ echo "statements run from my interactive shell."
statements run from my interactive shell.
sh-4.3$ echo "This will occur before I'm given the prompt."
This will occur before I'm given the prompt.
sh-4.3$ exec 3>&- <&4
sh-4.3$
많은 JOBS
쉘의 내장 된 작업 관리 옵션에 대해 좀 더 잘 알고 있어야한다고 생각합니다. @Kiwy와 @jillagre는 이미 답변 에서이 부분을 다루었지만 더 자세한 내용을 보증 할 수 있습니다. 그리고 난 이미 내장 한 POSIX 지정 특별 쉘을 언급하지만, 한 set, jobs, fg,
및 bg
몇 가지 더, 그리고 또 다른 대답은 보여로 trap
하고 kill
더 여전히 두 가지이다.
동시에 실행중인 백그라운드 프로세스의 상태에 대한 즉각적인 알림을받지 않은 경우 현재 쉘 옵션이 POSIX 지정 기본값 인으로 설정되어 있기 때문에 대신 -m
비동기식으로 가져올 수 있습니다 set -b
.
% man set
−b This option shall be supported if the implementation supports the
User Portability Utilities option. It shall cause the shell to
notify the user asynchronously of background job completions. The
following message is written to standard error:
"[%d]%c %s%s\n", <job-number>, <current>, <status>, <job-name>
where the fields shall be as follows:
<current> The character '+' identifies the job that would be
used as a default for the fg or bg utilities; this
job can also be specified using the job_id "%+" or
"%%". The character '−' identifies the job that
would become the default if the current default job
were to exit; this job can also be specified using
the job_id "%−". For other jobs, this field is a
<space>. At most one job can be identified with '+'
and at most one job can be identified with '−'. If
there is any suspended job, then the current job
shall be a suspended job. If there are at least two
suspended jobs, then the previous job also shall be a
−m This option shall be supported if the implementation supports the
User Portability Utilities option. All jobs shall be run in their
own process groups. Immediately before the shell issues a prompt
after completion of the background job, a message reporting the
exit status of the background job shall be written to standard
error. If a foreground job stops, the shell shall write a message
to standard error to that effect, formatted as described by the
jobs utility. In addition, if a job changes status other than
exiting (for example, if it stops for input or output or is
stopped by a SIGSTOP signal), the shell shall write a similar
message immediately prior to writing the next prompt. This option
is enabled by default for interactive shells.
유닉스 기반 시스템의 가장 기본적인 특징은 프로세스 처리 방법 signals
입니다. 나는 이 과정을 더글러스 아담스의 행성에 대한 설명에 비유하는 주제에 관한 깨달은 기사 를 읽었습니다.
"The Hitchhiker 's Guide to the Galaxy에서 Douglas Adams는 우울한 인간 무리와 허벅지에 아주 열심히 물려 인간과 의사 소통을하는 날카로운 이빨을 가진 특정 종류의 동물이 서식하는 매우 둔한 행성에 대해 언급합니다. 커널이 마비 또는 치명적인 신호를 보내서 프로세스와 통신하는 UNIX와 유사하다. 프로세스는 일부 신호를 가로 채서 상황에 적응하려고 시도하지만 대부분은 그렇지 않다. "
이것은을 참조합니다 kill signals
.
% kill -l
> HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
적어도 위의 인용문은 많은 질문에 대답했습니다. 예를 들어, 나는 항상 그것이 매우 이상하다고 생각했고 전혀 직관적이지 않은 것으로 dd
프로세스 를 모니터링하고 싶었다고 생각했다 kill
. 그것을 이해 한 후에 말이되었습니다.
나는 대부분의 사람들 이 정당한 이유 에 적응하려고하지 않는다고 말하고 싶다. 개발자들이 당신에게 중요하다고 생각한 정보로 터미널을 스팸 처리하는 프로세스보다 많은 성가신 것보다 훨씬 더 귀찮을 수있다. .
터미널 구성에 따라 (당신이 확인할 수있는 stty -a
) , CTRL+Z
를 전달하는 것 세트입니다 SIGTSTP
가능성이 셸 현재 전경 프로세스 그룹 리더로, 어느 또한 기본적으로 구성해야 trap
하는 신호와 마지막 명령을 일시 중지합니다. @jillagre와 @Kiwy의 답변이 함께 알 수 있듯이 원하는 대로이 기능을 원하는 목적에 맞게 조정하는 것을 막을 수는 없습니다.
SCREEN JOBS
따라서 이러한 기능을 활용하려면 먼저 해당 기능을 이해하고 자신의 요구에 맞게 처리를 사용자 정의해야합니다. 예를 들어, Github 에서 다음에 대한 screen
키 바인딩을 포함하는 screenrc를 찾았 습니다 SIGTSTP
.
# hitting 'C-z C-z' will run Ctrl+Z (SIGTSTP, suspend as usual)
bind ^Z stuff ^Z
# hitting 'C-z z' will suspend the screen client
bind z suspend
따라서 자식 screen
프로세스 또는 screen
원하는대로 자식 프로세스 자체로 실행되는 프로세스를 일시 중단하는 것이 간단 합니다.
그리고 바로 다음에 :
% fg
또는:
% bg
원하는대로 프로세스를 포 그라운드 또는 백그라운드로 설정하십시오. jobs
내장 언제든지 당신이 목록을 제공 할 수 있습니다. -l
피연산자를 추가하면 pid 세부 사항이 포함됩니다.