subShell 과 코드 블록

17121 단어
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 은 명령 서열 의 범 위 를 정 하 는 데 사 용 됩 니 다. (번역자 주: 두 개의 같은 limit string 사 이 는 명령 서열 입 니 다) 특수 기호 << < limit string 을 표시 하 는 데 사 용 됩 니 다. 이 기호의 역할 은 파일 의 출력 을 프로그램 이나 명령 의 stdin 으로 재 설정 하 는 것 입 니 다. interactive - program < command - file 과 비슷 합 니 다.command - file 포함: here document 은 아래 와 같 습 니 다:\#!/bin/bash  interactive-program <- 옵션 은 here document 의 limit string (< - limitString) 을 표시 합 니 다. 출력 할 때 앞 에 있 는 tab (빈 칸 이 아 닙 니 다) 를 억제 할 수 있 습 니 다. 이렇게 하면 스 크 립 트 의 가 독성 을 증가 시 킬 수 있 습 니 다.
마지막 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
          ,                ,           。

좋은 웹페이지 즐겨찾기