subShell 과 코드 블록
예;어떤 디 렉 터 리 트 리 를 파 이 프 를 통 해 다른 곳 으로 복사 합 니 다.
tar -cf - . | (cd/newdir; tar -xpf - )
코드 블록 개념 은 subShell 과 같 지만 새로운 프로 세 스 를 만 들 지 는 않 습 니 다.코드 블록 에 있 는 명령 은 괄호 {} 로 묶 고 주 스 크 립 트 의 상태 에 영향 을 줍 니 다.
하위 셸: 모든 셸 스 크 립 트 는 부모 셸 의 키 프로 세 스 에서 효과적으로 실 행 됩 니 다. 이 부모 셸 은 제어 터미널 이나 xterm 창 에서 명령 프롬프트 를 주 는 프로 세 스 를 말 합 니 다.
셸 스 크 립 트 도 자신의 하위 프로 세 스 를 시작 할 수 있 습 니 다. 이 하위 셸 들 은 스 크 립 트 를 병행 하고 효과 적 이 며 여러 개의 하위 작업 을 동시에 실행 할 수 있 습 니 다.
괄호 안에 있 는 명령 목록 (command 1; command 2; command 3;...) 괄호 안에 있 는 명령 목록 의 명령 은 키 셸 에서 실 행 됩 니 다.
하위 셸 의 변 수 는 하위 셸 이외 의 코드 블록 에 있어 서 보이 지 않 습 니 다. 물론 부모 프로 세 스 도 이러한 변 수 를 방문 할 수 없습니다. 부모 프로 세 스 는 이 하위 셸 을 만 드 는 셸 을 말 합 니 다. 사실은 이러한 변 수 는 모두 부분 변수 입 니 다.
하위 셸 의 디 렉 터 리 변경 은 부모 셸 에 영향 을 주지 않 습 니 다.
하위 셸 의 디 렉 터 리 변경 은 부모 셸 에 영향 을 주지 않 습 니 다. 부모 셸 은 아무런 영향 을 받 지 않 으 며 부모 셸 의 환경 도 변경 되 지 않 았 습 니 다.
하위 셸 의 또 다른 응용 프로그램 은 변수 가 정의 되 었 는 지 확인 하 는 데 사용 할 수 있 습 니 다.
[[ ${variable-x} != x || ${variable-y} != y ]] 또는 [${variable - x}! = x $variable]] 또는 [${variable + x} = x]] 혹시 [[ ${variable-x} != x ]]
"|"파이프 조작 자 를 사용 하여 I/O 흐름 을 키 셸 로 재 설정 합 니 다. 예 를 들 어 ls - al | (command).
괄호 안에 있 는 명령 은 하위 셸 을 시작 하지 않 습 니 다. {command 1; command 2; command 3;.. command N;}
Here Document: 하나의 here document 은 특수 한 목적 을 가 진 코드 세그먼트 입 니 다. I/O 를 사용 하여 명령 시퀀스 를 대화 프로그램 이나 명령 에 전달 합 니 다. 예 를 들 어 ftp, cat 또는 ex 텍스트 편집기 등 입 니 다.
COMMAND <
마지막 limit string 은 here document 마지막 줄 의 limit string 입 니 다. 첫 번 째 문자 부터 시작 해 야 합 니 다. 앞 에 공백 이 있 으 면 안 됩 니 다. 이 limit string 뒤의 공백 도 이상 을 일 으 킬 수 있 습 니 다. 공백 은 limit string 의 식별 을 막 을 수 있 습 니 다.
목록 구조: '목록 과' 또는 목록 '구 조 는 하나의 수단 을 제공 할 수 있 으 며, 이러한 수단 은 연속 적 인 명령 을 처리 할 수 있다.
목록 과: command - 1 & & command - 2 & & command - 3 &... command - n, 모든 명령 이 실 행 된 후 true (0) 로 돌아 가면 명령 이 순서대로 실 행 됩 니 다. 그 중 한 명령 이 false (0 값 이 아 닌) 로 돌아 가면 이 명령 체인 이 끊 기 고 실행 이 끝 납 니 다.(그러면 첫 번 째 로 false 로 돌아 가 는 명령 은 마지막 으로 실 행 된 명령 이 고 그 후의 명령 은 실행 되 지 않 습 니 다).
또는 목록: command - 1 | command - 2 | command - 3 |... command - n 명령 마다 false 로 돌아 가면 명령 체인 이 실 행 됩 니 다. 하나의 명령 이 true 로 돌아 가면 명령 체인 이 끊 기 고 실행 이 끝 납 니 다. (첫 번 째 true 로 돌아 가 는 명령 은 마지막 으로 실 행 될 명령 입 니 다) 분명히 이것 은 "목록"과 는 정반 대 입 니 다.
목록 과 목록 의 종료 상태 코드 는 마지막 명령 의 종료 상태 에 의 해 결 정 됩 니 다.
false && true || echo false # false#
( false && true ) || echo false # false
# But *not* false && ( true || echo false ) # ( )
# , , "&&" "||" . , .
프로 세 스 교체
프로 세 스 바 꾸 기 는 명령 바 꾸 기와 비슷 합 니 다. 명령 바 꾸 기 는 명령 의 결 과 를 하나의 변수 에 할당 합 니 다. 예 를 들 어 dir contents = 'ls - al' 또는 xfef = $(grep word datafile). 프로 세 스 바 꾸 기 는 프로 세 스 의 출력 을 다른 프로 세 스에 제공 합 니 다. (다시 말 하면 명령 의 결 과 를 다른 명령 에 보 냈 습 니 다)
괄호 로 확 장 된 명령 > (command), < command) 로 프로 세 스 를 시작 합 니 다./dev/fd/< n > 파일 을 사용 하여 괄호 안에 있 는 프로 세 스 처리 결 과 를 다른 프로 세 스에 보 냅 니 다. '<' 또는 '>' 와 괄호 사이 에는 빈 칸 이 없습니다. 빈 칸 을 추가 하면 오류 가 발생 합 니 다.
프로 세 스 교 체 는 두 명령 의 출력 을 비교 할 수 있 으 며, 같은 명령 의 다른 옵션 의 출력 을 비교 할 수 있 습 니 다.
comm <(ls -l) <(ls -al)diff <(ls $first_directory) <(ls $second_directory)cat <(ls -l) # ls -l | catsort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin) # 3 'bin' , . 3 ( , 3 ) 'sort'diff <(command1) <(command2) # .while read des what mask iface; do
echo $des $what $mask $ifacedone < <(route -n)
:
route -n |while read des what mask iface; do # .
echo $des $what $mask $ifacedone # . , Ulrich Gayer . . . while shell, , .
Shell 에서 스 크 립 트 변수 와 함수 변수의 역할 영역 http://blog.csdn.net/ltx19860420/article/details/5570902
(1) 셸 스 크 립 트 에서 정의 하 는 변 수 는 global 입 니 다. 그 역할 영역 은 정 의 된 곳 에서 시작 하여 셸 이 끝나 거나 삭 제 된 곳 으로 표 시 될 때 까지 입 니 다. 해석: 스 크 립 트 변수 v1 의 역할 영역 은 정 의 된 곳 에서 시작 하여 셸 이 끝 납 니 다. 함수 lx func 를 호출 하 는 곳 은 변수 v1 의 역할 영역 에 있 기 때문에 변수 v1 에 접근 하고 수정 할 수 있 습 니 다.
(2) 셸 함수 가 정의 하 는 변 수 는 기본적으로 global 입 니 다. 그 역할 영역 은 '함수 가 호출 되 었 을 때 변 수 를 정의 하 는 곳' 부터 셸 이 끝나 거나 삭 제 된 곳 이 표 시 될 때 까지 입 니 다. 함수 가 정의 하 는 변 수 는 local 로 정의 되 며 그 역할 영역 은 함수 에 국한 되 어 있 습 니 다. 단, 함수 의 매개 변 수 는 local 입 니 다.
해석: 함수 변수 v2 는 기본적으로 global 입 니 다. 그 역할 영역 은 '함수 가 호출 될 때 변수 정 의 를 실행 하 는 곳' 에서 시작 하여 셸 이 끝 날 때 까지 입 니 다. 함 수 를 정의 하 는 곳 에서 시작 하 는 것 이 아니 라 함 수 를 호출 하 는 곳 에서 시작 합 니 다. 인쇄 명령 은 변수 v2 의 역할 영역 에 있 기 때문에 변수 v2 에 접근 할 수 있 습 니 다.
해석: 함수 변수 v2 는 local 로 정의 되 어 있 으 며, 그 역할 영역 은 함수 에 국한 되 어 있 습 니 다. 인쇄 명령 은 함수 외 에 변수 v2 의 역할 영역 에 있 지 않 기 때문에 변수 v2 에 접근 할 수 없습니다. 함수 매개 변 수 는 local 이 며, 위치 변 수 를 통 해 접근 할 수 있 습 니 다. 출력 명령 의 첫 번 째 매개 변 수 를 출력 합 니 다.
(3) 같은 이름 이면 셸 함수 가 정의 하 는 local 변 수 는 스 크 립 트 가 정의 하 는 global 변 수 를 차단 합 니 다.
함수 가 호출 되 기 전에 함수 에서 설명 하 는 모든 변 수 는 함수 체 외 에서 볼 수 없습니다. 물론 local 로 명 시 된 변수 도 포함 되 어 있 습 니 다.
종료 상태 코드 함수 가 값 을 되 돌려 줍 니 다. 종료 상태 코드 라 고 합 니 다. 종료 상태 코드 는 return 명령 에 의 해 명확 하 게 지정 되 고 함수 의 마지막 명령 의 종료 상태 코드 에 의 해 지정 되 기도 합 니 다. (성공 하면 0 으로 되 돌아 갑 니 다. 그렇지 않 으 면 0 이 아 닌 값 으로 되 돌아 갑 니 다)... 스 크 립 트 에서 $? 를 사용 하여 종료 상태 코드 를 참조 할 수 있 습 니 다. 이러한 메커니즘 이 있 기 때문에 스 크 립 트 함수 도 C 함수 처럼 '반환 값' 이 있 습 니 다. return 은 함 수 를 종료 합 니 다. return 명령 [1] 선택 할 수 있 는 정형 파 라미 터 를 가 져 올 수 있 습 니 다. 이 정 수 는 함수 의 '종료 상태 코드' 로 사 용 됩 니 다.이 함 수 를 호출 하 는 스 크 립 트 를 되 돌려 주 고 이 정수 도 변수 $?. 함수 가 되 돌려 줄 수 있 는 가장 큰 정수 가 255 입 니 다. 함수 가 문자열 이나 배열 을 되 돌려 줄 수 있 도록 함수 밖에서 볼 수 있 는 전용 전역 변 수 를 사용 할 수 있 습 니 다.
방향 을 바 꾸 는 함수 의 stdin 함 수 는 본질 적 으로 코드 블록 입 니 다. 이것 은 stdin 이 방향 을 바 꿀 수 있다 는 것 을 의미 합 니 다.
2:shell
。( info bash)1:&,
If a command is terminated by the control operator `&', the shell executes the command asynchronously in a subshell.2:
Each command in a pipeline is executed in its own subshell3:
()
Placing a list of commands between parentheses causes a subshell
environment to be created4: 、 :
When Bash finds such a file while searching the `$PATH' for a command, it spawns a subshell to execute it. In other words, executing filename ARGUMENTS
is equivalent to executing
bash filename ARGUMENTS
: 。 , (fork) , , , , (buitin) 。
shell
liunx , , & .
ping www.baidu.com &
, shell job, shell ,job , .
, nohup , job shell , .
shell shell , shell . subshell .
start.sh
#!/bin/bash
ping www.baidu.com &
shell start.sh.
./start.sh
start.sh ping , start.sh ,ping , init . shell ping
프로 세 스 를 배경 에서 신뢰 할 수 있 게 실행 하 는 몇 가지 방법
shell /
from:http://bbs.chinaunix.net/viewthread.php?tid=733138&extra=&page=1
from:http://bbs.chinaunix.net/thread-1479880-2-1.html
from:http://tldp.org/LDP/abs/html/subshells.html
from:http://bbs.chinaunix.net/viewthread.php?tid=733138&extra=&page=1#
from:http://bbs.chinaunix.net/thread-742295-1-1.html
1、
cat sleep.sh
#!/bin/sh
sleep 100
[root@rhel-oracle shell]# ps -ef | grep sleep
root 9007 8947 1 05:10 pts/1 00:00:00 /bin/sh ./sleep.sh
root 9008 9007 0 05:10 pts/1 00:00:00 sleep 100
root 9010 8947 0 05:10 pts/1 00:00:00 grep sleep
[root@rhel-oracle shell]# echo $$
8947
[root@rhel-oracle shell]#
shell (sleep) shell,sh shell
, shell shell
shell shell , shell, shell ,shell , shell
2、
cat a
echo $$
15:40:22#~> (./a.sh)
2140
15:40:28#~> ./a.sh
3292
15:40:30#~> echo $$
1248
15:40:38#~> (echo $$)
1248
15:40:42#~>
$$ shell ,
[root@localhost ~]# echo $$;(echo $$);
15788
15788
bash4 $BASHPID
: , :
http://hi.baidu.com/leejun_2005/blog/item/6d0d9865433f8eeaf6365408.html
3、 child process/subshell :
Definition: A subshell is a child process launched by a shell (or shell script). #http://tldp.org/LDP/abs/html/subshells.html
A subshell does not create a new instance of the shell, just a new environment. #http://bbs.chinaunix.net/thread-1479880-2-1.html
, shell ?
, shell (init crontab ?)
echo a|grep a echo grep shell
a.sh , shell ( )
If this execution fails because the file is not in executable format, and the file is not a directory, it is assumed to be a shell script, a file containing shell commands. A subshell is spawned to execute it.
shell :
shell , export
14:28:07#tp#~> echo $BASHPID;(echo $BASHPID)
3918
5640
14:28:10#tp#~> echo $BASH_SUBSHELL;(echo $BASH_SUBSHELL)
0
1
14:28:25#tp#~>
shell shell shell ,
|
&
()
bash xxx.sh , , export 。
, C 。
shell shell, shell 。
info bash shell(sub shell) :
1: 。2: &,3: ();4: :filename ARGUMENTS
, fork+exec
4、 shell
pid ppid shell pid
, shell shell
, shell
shell
clone execve
shell , , fork shell, exec , shell , ps shell ,
,
subshell fork exec ?
,
5、 ,
a(){ sleep 30;}
a &
pstree -pa $$
rh,bash
bash,1248
+-bash,2452
| +-sleep,1672 30
+-pstree,288 -pa 1248
& shell,#If a command is terminated by the control operator &, the shell executes the command in the background in a subshell.
shell,
, , :
a(){ while true ;do : ;done; }
a &
pstree -pa $$
======================================================================================================
6、 :
sub shell sub shell nested sub shell 。
( ) command group sub-shell , nested sub-shell。
sub shell a child shell executed under an other shell
7、
1.Bash pipeline( |) subshell( shell) | , childprocess( )
2.fork process ,exec*
3. , $PID $PPID
4.fork , exec* exec* , exec*
8、 get_process
#!/bin/bash
ps -ef|grep get_process
./get_process
waker 3260 3193 0 08:47 pts/1 00:00:00 /bin/bash ./get_process
waker 3290 3193 0 08:48 pts/1 00:00:00 /bin/bash ./get_process
waker 3292 3290 0 08:48 pts/1 00:00:00 /bin/bash ./get_process
waker 3263 3193 0 08:48 pts/1 00:00:00 /bin/bash ./get_process
waker 3265 3263 0 08:48 pts/1 00:00:00 grep get_process
0.01mm
, , PPID 3193 /bin/bash ./get_process
3193
echo $$ 3193 ./get_process shell
shell 3193 subshell ./get_process
pid 3290 /bin/bash ./get_process
, 3291( ps) 3192( grep),
3192
fork exec*(grep.*)
pid N/A 3192
N/A /bin/bash ./get_process grep get_process
N/A exec*
3291 ps , , ps ,
3290(/bin/bash ./get_process)
1.
2. 3292 /bin/bash ./get_process
3. 3292 grep get_process
9、 ?
, ,source ./urcode.sh 、
10、 、 、 shell
Q1: shell “ ” ?
A: bash , : 。 :
1. (builtin)
shell , shell , 。 shell , :
cd /path
var=value
read var
export var
...
2. ("external command" or "disk command")
, 。 ,shell fork , exec , fork shell。
3.shell (script)
shell fork+exec , exec ( :#!/bin/sh), , , 。 , shell(Bourne shell,Korn shell cshell,rc ash,dash,bash,zshell,pdksh,tcsh,es...),awk,tcl/tk,expect,perl,python, 。 shell 。 shell shell, bash, shell shell, shell , shell 。
Q2: shell ?
A: ,shell 。 ,shell shell 、 。 shell , 。 ps 。 , :
sh script-name
shell “sh” , script-name ps 。
, pidof , shell ( shell shell ) ID:
pidof -x script-name
Q3: shell shell ?
shell , export
A: Bourne shell shell。 shell shell :
1.(...)
shell , shell 。 $$ shell id, shell id。
:
{...;} shell ,( ) shell 。
2.
command&
shell , shell 。 shell , 、 , 。
3.
`command`(Bourn shell shell/csh)
$(command)( ksh/bash/zsh )
command 。command shell , shell 。
4. ( shell )
cmd1|cmd2
cmd1 cmd2 , ,cmd2 cmd1 , “ ” 。
shell 。
linux shell(bash/pdksh/ash/dash , zshell ) shell , shell 。
Korn shell (ksh93 ) , shell 。 feature BUG, POSIX 。 :
command|read var
read var(read ) shell ,var shell 。
bash/pdksh/ash/dash read var shell ,var shell, var 。 news group 。 command|read var , , Korn shell feature 。 shell 。:( pdksh shell 。
Korn shell , , , shell 。 Bourne shell ( Bourne shell , )。 ,pdksh ash 。
zshell, zshell ( 3.0.5 ) shell , 。 shell , 。 sehll , unix 。;-)
, shell 。 shell command|read var ok , , 。
5. ( bash/zsh , POSIX )
<(...)
>(...)
, :cmd1 <(cmd2) >(cmd3), cmd1, cmd2, cmd3 。
<(command) ,command 。
>(command) , command 。
command shell , shell 。
6.if while
SVR4.2 Bourne shell fork shell if while ; linux shell 。
7. (ksh)
Korn shell pdksh ( shell )。 , , shell 。 ( read -p print -p) , 。
Q4: shell shell, shell ?
A: 。
shell shell, shell 。
shell shell, shell 。 : shell shell , shell( shell) 。
Q5: shell shell?
A: (echo "$a") | read b , ? :
1.
...
#in subshell
a=100
echo "$a">tmpfile
...
#in parent
read b<tmpfile
2.
mkfifo pipef
(...
echo "$a" > pipef
...)
read b <pipef
3. coprocess(ksh)
( echo "$a" |&)
read -p b
4.
b=`echo "$a"`
5. eval
eval `echo "b=$a"`
6. here document
read b <<END
`echo "$a"`
END
7. here string(bash/pdksh)
read b <<<`echo "$a"`
8. shell, . source 。
shell , shell, shell 。:)
14:55:31#tp#~> cat a.sh
echo $BASH_SUBSHELL
14:55:51#tp#~> . a.sh
0
source shell
, , 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.