Bash 쉘 확장을 중지하는 방법은 무엇입니까?

Bash 쉘 확장을 중지하는 방법은 무엇입니까?

나는 그 과정을 멈추는 몇 가지 방법을 알고 있습니다. 내가 입력할 때:

echo {1..999999} > filename.txt 

나는 그것이 실행되는 것을 막을 수 없다. Ctrl+ | + + 등 을 사용하여 C다른 프로세스를 중지 할 수 있습니다 . 하지만 그들 중 누구도 이 명령을 사용하지 않는 것 같습니다.CtrlDCtrl\

어떤 사람들은 나에게 이 터미널을 닫으라고 말했습니다. 게다가 새 터미널을 열면 모든 터미널 프로세스가 종료되는데 그렇게 하고 싶지는 않습니다. 서버에서는 새 터미널을 열 기회가 없을 것 같아요.

텍스트 모드에서 새 터미널 세션을 열 수 있나요?

답변1

Ctrlc현재 쉘이 어떤 명령도 실행하고 있지 않기 때문에 -etc...를 사용하여 작업을 중단할 수 없습니다 . {1..999999}명령을 실행하는 지점에 도달하면 명령줄 인수가 어떻게 될지 파악하기 위해 확장하느라 바쁩니다.

외부 명령은 종료 신호( SIGINT-를 누를 때 기본적으로 실행됨)에 응답하지만 셸 자체는 이를 무시합니다. 그렇지 않은 경우 -를 누르면 실행 중인 모든 명령을 종료하는 것 외에도 쉘 자체도 종료합니다! (tty 작업 제어와 포그라운드 및 백그라운드 프로세스 그룹으로 인해 이는 전적으로 사실이 아니지만 설명 목적으로는 충분히 유사합니다.)CtrlcCtrlc

이를 중단해야 하는 경우 불행하게도 쉘 자체만 종료할 수 있습니다. 셸 자체를 종료하면 세션이 종료됩니다. 이러한 의미에서는 터미널 창을 닫거나 SSH 연결을 종료하는 것과 거의 동일합니다.

답변2

ctrl+ 로 중지할 수 있는 대안을 원한다면 cbash에서 다음을 수행할 수 있습니다.

i=1; while [ $i -le 999999 ]; do echo $((i++)) >> filename.txt; done

리디렉션 기호를 사용하세요.1 >>파일을 덮어쓰는 대신 파일에 추가합니다.


ctrl또한 괄호를 사용하여 서브쉘에서 명령을 실행할 때 +로 중지 할 수 있는 것 같습니다 . Celada에서 설명한 이유로 인해 출력 파일은 생성되지 않습니다.c( echo {1..999999} > numero.txt )

바라보다서브셸 - 고급 Bash 스크립팅 가이드


Celada의 답변을 추가로 지원하기 위해 bash 셸의 포크 및 실행 시나리오의 실행 순서는 다음과 같습니다. 쉘 확장이 완료될 때까지 명령이 실행되지 않는 것을 볼 수 있습니다. 명령에서 echo {1..999999} > filename.txt상위 쉘쉘 확장 프로세스가 진행 중입니다. ctrl+ c물론 상위 쉘은 종료되지 않습니다.

~에서Bash 초보자 가이드 1.4.1.1. 쉘 구문

입력이 주석 처리되지 않은 경우 쉘은 입력을 읽고 입력의 각 문자 의미를 정의하는 인용 규칙을 사용하여 단어와 연산자로 분리합니다. 그런 다음 이러한 단어와 연산자는 명령 및 기타 구조로 변환되어 검사 또는 처리에 사용할 수 있는 종료 상태를 반환합니다. 위의 분기 및 실행 방식은 셸이 다음과 같이 입력을 구문 분석한 후에만 적용됩니다.

  • 쉘은 파일, 문자열 또는 사용자 터미널에서 입력을 읽습니다.

  • 입력은 인용 규칙에 따라 단어와 연산자로 분류됩니다. 3장을 참조하세요. 이러한 태그는 메타 문자로 구분됩니다. 별칭 확장을 수행합니다.

  • 셸은 토큰을 단순 명령과 복합 명령으로 구문 분석(분석 및 교체)합니다.

  • Bash는 다양한 쉘 확장을 수행하여 확장된 토큰을 파일 이름, 명령 및 인수 목록으로 나눕니다.

  • 필요한 경우 리디렉션이 수행되고 리디렉션 연산자와 해당 피연산자가 매개변수 목록에서 제거됩니다.

  • 명령이 실행됩니다.

  • (선택 사항) 셸은 명령이 완료될 때까지 기다리고 종료 상태를 수집합니다.

~에서Bash 초보자 가이드 3.4.1. 일반적인

명령이 토큰으로 분할된 후(섹션 1.4.1.1 참조) 이러한 토큰이나 단어가 확장되거나 구문 분석됩니다. 8개의 확장이 수행되며 다음 섹션에서 확장 순서에 따라 논의합니다.

브레이크 확장은 확장 순서에 따라 먼저 수행됩니다.


쉘 확장 중지

kill -SIGSTOP <pid>실제로 pid를 쉘에 보내면 쉘 확장을 중지할 수 있습니다. echo $$현재 쉘의 pid를 제공하거나 pgrep -l bash어떤 쉘이 확장을 실행하고 있는지 확인할 수 있습니다.

중단된 부분부터 확장을 재개하는 데 사용할 수 있습니다 kill -SIGCONT <pid>.

상위 쉘을 종료하거나 종료시키는 것 외에 확장을 종료하는 방법은 없습니다. 나에게 이것은 서브셸에서 확장을 실행하는 좋은 예입니다.

관련 정보