내가 읽은 것에서 괄호 안에 명령을 넣으면 스크립트를 실행하는 것과 비슷한 하위 셸에서 명령을 실행해야합니다. 이것이 사실이라면, x가 내보내지지 않으면 어떻게 변수 x를 볼 수 있습니까? x=1 (echo $x)명령 행에서 실행 하면 1이됩니다. echo $x스크립트에서 실행 하면 예상대로 아무것도 발생하지 않습니다.
스크립트가 있는데 원하는 때 종료되지 않습니다. 동일한 오류가있는 예제 스크립트는 다음과 같습니다. #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' 출력을 보겠다고 가정합니다. :~$ ./test.sh 1 :~$ 그러나 실제로 볼 수 있습니다 : :~$ ./test.sh 1 2 :~$ 않습니다 ()어떻게 …
따르면 이 , 중괄호 명령 목록을 배치하는 것은 현재 셀 환경에서 실행되는리스트를 야기한다. 서브 쉘이 작성되지 않습니다 . ps이것을 실제로 사용 하기 위해 사용 이것은 명령 줄에서 직접 실행되는 프로세스 파이프 라인의 프로세스 계층입니다. 4398은 로그인 쉘의 PID입니다. sleep 2 | ps -H; PID TTY TIME CMD 4398 pts/23 00:00:00 …
이 스 니펫을 고려하십시오. stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } 일반적으로 func호출되면 스크립트가 종료되며 이는 의도 된 동작입니다. 그러나 다음과 같은 하위 셸에서 실행되는 경우 result=`func` 스크립트를 종료하지 않습니다. 이것은 호출 코드가 …
exit터미널에서 나가지 않도록 내장 기능을 대체하는 함수를 작성하려고합니다 . SHLVL환경 변수 를 사용하려고 시도했지만 하위 쉘 내에서 변경되지 않는 것 같습니다. $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 내 기능은 다음과 같습니다. exit () { if [[ $SHLVL -eq 1 ]]; …
서브 쉘 작성에 대한 Bash 규칙을 오해하는 것 같습니다. 괄호는 항상 자체 프로세스로 실행되는 서브 쉘을 생성한다고 생각했습니다. 그러나 이것은 사실이 아닙니다. 코드 스 니펫 A (아래)에서 두 번째 sleep명령은 pstree다른 터미널에서 결정된 별도의 셸에서 실행되지 않습니다 . 그러나 코드 조각 B에서 두 번째 sleep명령 은 별도의 셸에서 실행됩니다. 스 …
Randal L. Schwartz 는 2013 년 8 월 19 일, Linux에서 "경쟁 조건없이 또는 잠금 파일을 정리하지 않고 하나의 스크립트 인스턴스 만 실행되도록" 이 쉘 스크립트를 게시 했습니다 . #!/bin/sh # randal_l_schwartz_001.sh ( if ! flock -n -x 0 then echo "$$ cannot get flock" exit 0 fi echo "$$ …
Learning Bash Book은 서브 쉘이 환경 변수 및 파일 디스크립터 등 만 상속하고 내 보내지 않은 변수는 상속하지 않는다고 언급합니다. $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ 아시다시피 셸은 for ()및 for에 대해 두 개의 하위 셸을 만들지 ./file만, …
내가 예상 cat <(cat)과 cat | cat같은 일을 : 표준 출력 stdin에서 라인을 복사합니다. 내 이해는 둘 다 cat서브 쉘에서 실행 하고 서브 쉘 cat의 stdout을 임시 명명 된 파이프로 cat리디렉션 한 다음 stdin이 파이프로 리디렉션 된 현재 쉘에서 다른 것을 실행 한다는 것입니다. 대신 cat <(cat)터미널에 입력 할 수 …
다음과 같이 bash 스크립트가 있다고 가정하십시오. echo "x" & echo "y" & echo "z" & ..... echo "Z" & wait 하위 쉘 / 하위 프로세스의 종료 코드를 수집하는 방법이 있습니까? 이 작업을 수행하는 방법을 찾고 있으며 아무것도 찾을 수 없습니다. 이 서브 쉘을 병렬로 실행해야합니다. 그렇지 않으면 더 쉽습니다. 일반 …
요즘 배쉬에 이상한 문제가 있습니다. 스크립트를 단순화하려고 할 때이 작은 코드 조각을 생각해 냈습니다. $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 return인쇄하지 않고 기능을 종료 $?했어야합니까? 그럼 …
Bash에서 모든 호출마다 카운트를 늘리고 반환하는 함수를 구현하고 싶습니다. 불행히도 이것은 하위 쉘 내부에서 함수를 호출하기 때문에 사소하지 않은 것처럼 보이므로 결과적으로 상위 쉘의 변수를 수정할 수 없습니다. 내 시도는 다음과 같습니다. PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } 이것은 다음과 같이 사용됩니다 (따라서 …
이것 과 이것 에 따르면 , 괄호를 사용하여 서브 쉘이 시작됩니다 (…). ( echo "Hello" ) 이것 , 이것 과 이것 에 따르면 , 명령이& echo "Hello" & Posix 스펙 은이 페이지 에서 단어 subshell를 사용 하지만이를 정의하지 않으며 동일한 페이지에서 "자식 프로세스"를 정의하지 않습니다 . 둘 다 커널 fork()기능을 …
다음 스크립트를 시도했습니다. #!/bin/bash trap 'echo "touching a file" && touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo 위 스크립트의 출력은 다음과 같습니다. [root@usr1 my_tests]# ./test.sh foo1 foo touching a file 그러나 나는 foo1서브 쉘 에서 호출 될 때 트랩이 호출 될 것으로 …