셸 스 크 립 트 의 입문

46945 단어 linux
Linux 의 셸 은 여러 가지 유형 이 있 는데 그 중에서 가장 많이 사용 되 는 몇 가 지 는 Bourne 셸 (sh), C 셸 (csh) 과 Korn 셸 (ksh) 이다.세 종류의 셸 은 각각 장단 점 이 있다.본 셸 은 유 닉 스 가 최초 로 사용 한 셸 이 며, 유 닉 스 마다 사용 할 수 있다.Bourne 셸 은 셸 프로 그래 밍 에 있어 서 상당히 우수 하지만 사용자 와 의 상호작용 을 처리 하 는 데 있어 서 다른 몇 가지 셸 보다 못 하 다.Linux 운영 체제 에 부족 한 셸 은 Bourne Again 셸 입 니 다. Bourne 셸 의 확장 입 니 다. Bash 라 고 부 르 며 Bourne 셸 과 완전히 뒤로 호 환 되 고 Bourne 셸 을 바탕 으로 많은 특성 을 증가 하고 강화 하 였 습 니 다.Bash 는 / bin / bash 에 놓 여 있 습 니 다. 명령 보완, 명령 편집 과 명령 기록 표 등 기능 을 제공 할 수 있 습 니 다. C 셸 과 Korn 셸 의 장점 도 많이 포함 되 어 있 고 유연성 과 강력 한 프로 그래 밍 인터페이스 가 있 으 며 우호 적 인 사용자 인터페이스 도 있 습 니 다.
지원 하 는 셸 형식 을 볼 수 있 습 니 다 cat /etc/shells.우리 가 가장 자주 사용 하 는 것 은 바로 bash 이다.호 환 sh
  • 두 성명
  • 셸 스 크 립 트 첫 줄 은 \ #!처음에 이 스 크 립 트 는 뒤의 해석 기 를 사용 하여 실행 을 설명 합 니 다.
    #!/bin/bash 
    

    셸 변수
    주의 점:
  • 셸 변수 "=" 양쪽 에 빈 칸 이 있 으 면 안 됩 니 다.
  • 합 법 적 인 식별 자 (자모, 숫자,) 는 키 워드 를 사용 할 수 없습니다.
  • 이니셜 은 반드시 글자 여야 한다.

  • 변 수 를 할당 할 때 중간 에 있 는 것 은 번호 앞 뒤 에 빈 칸 이 있어 서 는 안 됩 니 다.
    name=11
    echo $name
    1name //  
    _name //  
    name = "hello" //  
    
  • 사용 변수
  • 정 의 된 변 수 는 $를 사용 하여 이 변 수 를 직접 방문 합 니 다.
    name="test"
    echo $name
    echo ${name}
    
    a=z                  # Assign the string "z" to variable a.
    b="a string"         # Embedded spaces must be within quotes.
    c="a string and $b"  # Other expansions such as variables can be 
    
    # expanded into the assignment.
    d="$(ls -l foo.txt)" # Results of a command.
    e=$((5 * 7))         # Arithmetic expansion.
    f="\t\ta string
    " # Escape sequences such as tabs and newlines.
  • 변수 만 읽 습 니 다.

  • 변수 앞 에 readonly 를 추가 하면 이 변 수 는 읽 기만 합 니 다.상수 와 유사 하 다.
    readonly PI=3.14
    echo $PI
    
  • 변수 삭제
  • 변수 가 더 이상 사용 되 지 않 을 때 unset 로 삭제 할 수 있 습 니 다.
    name="test"
    unset $name
    

    변수의 종류.부분 변수, 환경 변수, 셸 변수 가 있 습 니 다.
    문자열
    문자열 은 php 와 유사 합 니 다.작은 따옴표 와 작은 따옴표 로 묶 을 수 있 지만, 작은 따옴표 로 묶 은 문자열 은 그 안의 변 수 를 해석 할 수 있 습 니 다.
    작은 따옴표 안에 작은 따옴표 가 나타 나 면 안 됩 니 다.
    str="hello''"
    str2='hello'
    str3='"test"'//  
    str4="str2$str2"
    echo $str4
    
  • 문자열 연결
  • 문자열 의 연결 은 다른 언어 와 다르다.필요없다
    name1="hello"
    name2="world"
    
    echo $name1 $name2// hello world
    
  • 문자열 의 길이 "\ #"
  • 가 져 오기
    str="helloworld"
    ${#str}
    
  • 문자열 절편
  • 콜론 사용:
    str="helloworld"
    
    echo ${str:0:4} // 0    4    hell
    
  • 문자열 판단 작업
  •     ${var}	  var  ,  $var  
         	 
        ${var-DEFAULT}	  var     ,     $DEFAULT     *
        ${var:-DEFAULT}	  var     ,       ,     $DEFAULT     *
         	 
        ${var=DEFAULT}	  var     ,     $DEFAULT     *
        ${var:=DEFAULT}	  var     ,       ,     $DEFAULT     *
         	 
        ${var+OTHER}	  var   ,       $OTHER,     null   
        ${var:+OTHER}	  var    ,       $OTHER,     null   
         	 
        ${var?ERR_MSG}	  var    ,      $ERR_MSG *
        ${var:?ERR_MSG}	  var    ,      $ERR_MSG *
         	 
        ${!varprefix*}	       varprefix         
        ${!varprefix@}	       varprefix         
        
    
  • 문자열 캡 처
  • ${#string}	$string   
     	 
    ${string:position}	 $string ,    $position      
    ${string:position:length}	 $string ,    $position       $length   
     	 
    ${string#substring}	   $string   ,       $substring   
    ${string##substring}	   $string   ,       $substring   
    ${string%substring}	   $string   ,       $substring   
    ${string%%substring}	   $string   ,       $substring   
     	 
    ${string/substring/replacement}	  $replacement,          $substring
    ${string//substring/replacement}	  $replacement,        $substring
    ${string/#substring/replacement}	  $string     $substring,     $replacement       $substring
    ${string/%substring/replacement}	  $string     $substring,     $replacement       $substring
    
      
    
    str="hello"
    
    echo ${#str}//5
    echo ${str:0:2} //he
    
    echo ${str/l/test}//heltesto
    echo ${str//l/test} //hetesttesto
    
  • here document
  • command << token
    text
    token
    
    # shell example
    cat << _EOF_
    
        
            <span class="token variable">$TITLE</span>
        
    
    _EOF_
    
    # terminal example
    
    $ cat << _EOF_
    
    \> $foo
    \> "$foo"
    \> '$foo'
    \> \$foo
    \> _EOF_
    

    대괄호 역할
    $a
    ${a}
    a="foo"
    echo "${a}_file" #                   
    

    빈 문자 와 존재 하지 않 는 문자 처리
    parameter         word,       。
    ${parameter:-word}
    
           ,  :   。
    ${parameter:=word}
    
    unset empty    word error
    ${parameter:?word}
    
    ${parameter:+word}
    

    String operation (문자열 연산 자)
    ${#parameter} #     
    
    $ foo="This string is long."
    $ echo "'$foo' is ${#foo} characters long.
    'This string is long.' is 20 characters long
    
    ${parameter:offset}
    ${parameter:offset:length}
    [me@linuxbox ~]$ foo="This string is long."
    [me@linuxbox ~]$ echo ${foo:5}
    string is long.
    [me@linuxbox ~]$ echo ${foo:5:6}
    string
    
         
    ${parameter#pattern}
    ${parameter##pattern}
    [me@linuxbox ~]$ foo=file.txt.zip
    [me@linuxbox ~]$ echo ${foo#*.}
    txt.zip
    [me@linuxbox ~]$ echo ${foo##*.}
    zip
    
        
    ${parameter%pattern}
    ${parameter%%pattern}
    [me@linuxbox ~]$ foo=file.txt.zip
    [me@linuxbox ~]$ echo ${foo%.*}
    file.txt
    [me@linuxbox ~]$ echo ${foo%%.*}
    file
    
      
    ${parameter/pattern/string}
    ${parameter//pattern/string}
    ${parameter/#pattern/string}
    ${parameter/%pattern/string}
    

    expansion 으로 script 의 효율 을 높 일 수 있 습 니 다.
    대소 문자 변환
    무엇 에 쓸 수 있 습 니까?예 를 들 어 데이터 베 이 스 를 찾 을 때 입력 과 데이터 베 이 스 를 모두 대소 문자 로 통일 합 니 다.
    declare
    셸 은 부동 소수점 연산 을 할 수 없습니다.
    itscs-MacBook-Pro:learnCommandLine itsc$ echo $((3.3+4.2))
    -bash: 3.3+4.2: syntax error: invalid arithmetic operator (error token is ".3+4.2")
    

    해결: perl, awk. 책 에서 가장 간단 한 bc 로
    왜 부동 소수점 연산 도 지원 하지 않 습 니까?귀찮아.
    배열
    셸 배열 은 1 차원 배열 만 지원 합 니 다.
    php 와 유사 합 니 다.배열 의 크기 를 지정 할 필요 가 없습니다.
    배열 을 괄호 로 끌어안다.모든 요 소 를 빈 칸 으로 분할 합 니 다.
    arr=(a1 a2 a3)
    arr=(1 2 3)
    ${arr[0]}//1
    
    a[1]=foo
    echo ${a[1]}
    foo
    
    declare -a a
    
    #     
    name[subscript]=value
    name=(value1 value2 ...)
    [me@linuxbox ~]$ days=(Sun Mon Tue Wed Thu Fri Sat)
    [me@linuxbox ~]$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
    
    
  • 배열 의 모든 요 소 를 가 져 옵 니 다
  • @ 또는 * 를 사용 하면 배열 의 모든 요 소 를 가 져 올 수 있 습 니 다.
    ${arr[*]}
    
  • 배열 의 길 이 를 가 져 옵 니 다
  • ${#arr[*]}
    
  • 배열 을 옮 겨 다 니 기
  • [me@linuxbox ~]$ animals=("a dog" "a cat" "a fish")
    [me@linuxbox ~]$ for i in ${animals[*]}; do echo $i; done
    [me@linuxbox ~]$ for i in ${animals[@]}; do echo $i; done
    [me@linuxbox ~]$ for i in "${animals[*]}"; do echo $i; done
    [me@linuxbox ~]$ for i in "${animals[@]}"; do echo $i; done
    

    bash 의 array 가 꼭 연속 되 는 것 은 아 닙 니 다.
    그래서 어떤 위치 에 값 이 있 는 지 아 는 방법 이 필요 해 요.
    [me@linuxbox ~]$ foo=([2]=a [4]=b [6]=c)
    
    [me@linuxbox ~]$ for i in "${foo[@]}"; do echo $i; done
    a
    b
    c
    
    [me@linuxbox ~]$ for i in "${!foo[@]}"; do echo $i; done
    2
    4
    6
    
  • 배열 n 번 째 요소 의 길이
  • ${#arr[2]}
    
  • 배열 절편
  • ${arr[*]:0:2} //1 2
    
  • 배열 검색 교체
  • ${arr[*]/3/5}
    
  • array 의 추가
  • arr=("${arr[*]}"  "test")
    
    $ foo=(a b c)
    $ foo[100]=e
    $ echo ${foo[@]}
    a b c e
    $ foo+=(k l)
    $ echo ${foo[@]}
    a b c e k l
    $ for i in "${foo[@]}"; do echo $i; done
    a
    b
    c
    e
    k
    l
    $ for i in "${!foo[@]}"; do echo $i; done
    0
    1
    2
    100
    101
    102
    

    subscript 는 연속 이 아 닙 니 다.
    associative arrays
    아래 표 시 는 문자 일 수 있 습 니 다.
    연산 자
    논리 연산 자
    &&	    AND	[[ $a -lt 100 && $b -gt 100 ]]    false
    ||	    OR	[[ $a -lt 100 || $b -gt 100 ]]    true
    

    문자열 비교
    =	           ,     true。	[ $a = $b ]    false。
    !=	           ,      true。	[ $a != $b ]    true。
    -z	          0, 0   true。	[ -z $a ]    false。
    -n	          0,  0   true。	[ -n $a ]    true。
    str	         ,      true。	[ $a ]    true。
    

    관계 연산 자
    관계 연산 자 는 숫자 만 지원 합 니 다.
    eq	         ,     true。	[ $a -eq $b ]    false。
    -ne	         ,      true。	[ $a -ne $b ]    true。
    -gt	             ,   ,    true。	[ $a -gt $b ]    false。
    -lt	             ,   ,    true。	[ $a -lt $b ]    true。
    -ge	               ,   ,    true。	[ $a -ge $b ]    false。
    -le	               ,   ,    true。	[ $a -le $b ]    true。
    a=10
    b=20
    if [[ $a eq $b ]];then
    echo "  "
    fi
    

    불 연산 자
    !	   ,     true     false,     true。	[ ! false ]    true。
    -o	   ,        true     true。	[ $a -lt 20 -o $b -gt 100 ]    true。
    -a	   ,        true     true。	[ $a -lt 20 -a $b -gt 100 ]    false。
    

    파일 테스트 기호
    b file	            ,   ,    true。	[ -b $file ]    false。
    -c file	             ,   ,    true。	[ -c $file ]    false。
    -d file	         ,   ,    true。	[ -d $file ]    false。
    -f file	           (     ,       ),   ,    true。	[ -f $file ]    true。
    -g file	          SGID  ,   ,    true。	[ -g $file ]    false。
    -k file	            (Sticky Bit),   ,    true。	[ -k $file ]    false。
    -p file	           ,   ,    true。	[ -p $file ]    false。
    -u file	          SUID  ,   ,    true。	[ -u $file ]    false。
    -r file	        ,   ,    true。	[ -r $file ]    true。
    -w file	        ,   ,    true。	[ -w $file ]    true。
    -x file	         ,   ,    true。	[ -x $file ]    true。
    -s file	        (        0),      true。	[ -s $file ]    true。
    -e file	    (    )    ,   ,    true。	[ -e $file ]    true。
    file=""
    if [[-f $file ]]; then
        echo "is a file"
    fi
    

    3. 절차 제어
    3.1 if/else
    if [condition];then
    	echo '1'
    fi
    
    # if else
    if [condition]; then
    	echo '1'
    else
    	echo '2'
    fi
    
    # if elseif else
    if [condition];then
    
    elif [condition];then
    
    fi
    
    x=5
    if [ "$x" -eq 5 ]; then
        echo "x equals 5."
    else
        echo "x does not equal 5."
    fi  
    

    3.1.1 test
    문법:
    test expression
    and the more popular:
    [ expression ]
    

    expression 은 true 일 때 0 으로 돌아 갑 니 다. 그렇지 않 으 면 1 로 돌아 갑 니 다. test 와 [본질 적 으로 같 습 니 다.
    사용:
    #!/bin/bash
    # test-file: Evaluate the status of a file
    
    FILE=~/.bashrc
    
    if [ -e "$FILE" ]; then
        if [ -f "$FILE" ]; then
            echo "$FILE is a regular file."
        fi
        
        if [ -d "$FILE" ]; then
            echo "$FILE is a directory."
        fi
        
        if [ -r "$FILE" ]; then
            echo "$FILE is readable."
        fi
        
        if [ -w "$FILE" ]; then
            echo "$FILE is writable."
        fi
        
        if [ -x "$FILE" ]; then
            echo "$FILE is executable/searchable."
        fi
    else
        echo "$FILE does not exist"
        exit 1
    fi
    
    exit  # ?
    

    When a script “runs off the end” (reaches end of file), it terminates with an exit status of the last command executed.
    String Expressions
    #!/bin/bash
    # test-string: evaluate the value of a string
    
    ANSWER=maybe
    
    if [ -z "$ANSWER" ]; then
        echo "There is no answer." >&2
        exit 1
    fi
    
    if [ "$ANSWER" = "yes" ]; then
        echo "The answer is YES."
    elif [ "$ANSWER" = "no" ]; then
        echo "The answer is NO."
    elif [ "$ANSWER" = "maybe" ]; then
        echo "The answer is MAYBE."
    else
        echo "The answer is UNKNOWN."
    

    Integer Expressions
    test 옵션 이 정말 많아 요!!!
    test 용 regex
    [[]]
    #       
    if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
    

    (( )) - Designed For Integers
    $ if ((1)); then echo "It is true."; fi
    
    It is true.
    
    if ((INT == 0)); 
    
    if ((INT < 0)); 
    
    if (( ((INT % 2)) == 0)); 
    

    Combining Expressions
    Operation   test   [[ ]] and (( ))
    AND         -a           &&
    OR          -o           ||
    NOT         !            !
    

    예시
    # [[]]
    if [[ "$INT" -ge "$MIN_VAL" && "$INT" -le "$MAX_VAL" ]];
    
    # test
    if [ "$INT" -ge "$MIN_VAL" -a "$INT" -le "$MAX_VAL" ];
    

    Control Operators: Another Way To Branch
    The && (AND) and || (OR)
    $ mkdir temp && cd temp
    $ [[ -d temp ]] || mkdir temp
    

    [] 와 [] 의 차이
    [[] 와 [] 는 같 지만 두 가지 새로운 특성 이 있 습 니 다.:
    string1 =~ regex
    == operator
    [[] 와 표현 식 사이 에 빈 칸 이 있어 야 합 니 다.
    [[ "$count" -gt 5 ]]
    [[ "$count" -gt 5]] #    ,        
    

    3.2 for
    #     
    
    for variable [in words]; do
        commands
    done
    
    # c   
    for (( expression1; expression2; expression3 )); do
        commands
    done
    

    demo 예
    [me@linuxbox ~]$ for i in A B C D; do echo $i; done
    
    itscs-MacBook-Pro:~ itsc$ for i in {A..D}; do echo $i; done
    
    #      pathname expansion
    itscs-MacBook-Pro:learnCommandLine itsc$ for i in dis*.txt; do echo "$i"; done
    
    

    3.3 while 와 until
    while
    문법:
    while commands; do commands; done
    
    #!/bin/bash
    
    # while-count: display a series of numbers
    count=1
    
    while [[ "$count" -le 5 ]]; do
        echo "$count"
        count=$((count + 1))
    done
    echo "Finished."
    

    Breaking Out Of A Loop:break、continue、until
    while 와 는 반대 입 니 다.
    count=1
    until [[ "$count" -gt 5 ]]; do
        echo "$count
        count=$((count + 1))
    done
    echo "Finished.
    

    read file with loop
    #!/bin/bash
    # while-read
    
    while read distro version release; do
        printf "distro: %s\tversion: %s\treleased: %s
    "
    \ "$distro" \ "$version" \ "$release" done < distros.txt

    3.4 case
      #!/bin/bash
      # case-menu
      
      clear
      echo "
      please select:
      
    1. display system information
    2. display disk space
    3. display home space utilization
    0. quit
    "
    read -p "enter selection [0-3] > "
    
    case "$REPLY" in
        0)  echo "program terminated"
            exit
            ;;
        1)  echo "hostname: $HOSTNAME"
            uptime
            ;;
        2)  df -h
            ;;
        3) if [[ "$(id -u)" -eq 0 ]]; then
                echo "home space utilization (all users)"
                du -sh /home/*
            else
                echo "home space utilization ($USER)"
                du -sh "$HOME"
            fi
            ;;
        *)  echo "invalid entry" >&2
            exit 1
            ;;
    esa
    

    3.5 종합
    #! /bin/bash
    
    a=10
    b=20
    
    #     
    if [[ $a -ne $b ]]; then
        echo "a    b"
    fi
    
    #      
    if [[ '$a' != '$b' ]]; then
        echo "1"
    fi
    
    #     
    if [[  -d "../doc" ]]; then
        echo "dirctory"
    fi
    
    if [[ ! -f "../routes" ]]; then
        echo "not a file"
    fi
    
    #while
    while [[ $a -gt 1   ]]; do
        #statements
        echo $a;
        #   
        let a--
    done
    
    # for
    for i in "wo" "rds"; do
        echo $i
    done
    

    함수
  • 함수 정 의 는 다음 과 같 습 니 다. [function] functionName () {}, 그 중에서 function 은 생략 할 수 있 습 니 다
  • function test(){}
    
    # and the simpler (and generally preferred) form:
    test(){}
    
  • 함수 호출
  • 함수 호출 은 다른 언어의 호출 과 그다지 같 지 않다.
    function test(){
        echo "hello"
    }
    
    test #    
    
  • 함수 의 매개 변수
  • 함수 의 매개 변수 정 의 는 () 에서 형 삼 을 정의 할 필요 가 없습니다. 호출 에서 만 사용 하면 됩 니 다.$n n $1 은 첫 번 째 매개 변수 입 니 다.
    function test(){
        echo $1 #           
    }
    test 22 //22
    
  • 국부 변수 local
  • 셸 함수 가 정의 하 는 변 수 는 기본적으로 global 입 니 다. 그 역할 영역 은 "함수 가 호출 되 었 을 때 변 수 를 정의 하 는 곳" 에서 시작 하여 셸 이 끝나 거나 삭 제 된 곳 이 표 시 될 때 까지 입 니 다. 함수 가 정의 하 는 변 수 는 local 로 정의 되 며 그 역할 영역 은 함수 에 국한 되 어 있 습 니 다. 단, 함수 의 매개 변 수 는 local 입 니 다.
    funct_1 () {
        local foo # variable foo local to funct_1
        foo=1
        echo "funct_1: foo = $foo"
    }
    

    외부 파일 도입
    셸 에 서 는 외부 스 크 립 트 파일 을 도입 해 야 할 때 가 있 습 니 다. 다음 두 가지 방식 을 사용 해 야 합 니 다.
  • . filename
  • . ./a.sh
    
  • source filename

  • 파일 에 source 사용 하기
    source  ./a.sh
    

    6. 명령 행 수신 매개 변수
    셸 스 크 립 트 를 실행 할 때 스 크 립 트 에 파 라 메 터 를 전달 합 니 다. 스 크 립 트 에서 파 라 메 터 를 가 져 오 는 형식 은 $n 입 니 다. n 은 하나의 숫자 를 대표 합 니 다. 1 은 스 크 립 트 를 실행 하 는 첫 번 째 매개 변수 이 고 2 는 스 크 립 트 를 실행 하 는 두 번 째 매개 변수 입 니 다.
    $ bash test.sh test test2
      $0          //test.sh
      $1         //test
      $#       // 2
      $*      
      
      basename           ,     。
    
    for i in  $*; do
    	echo $i
    done
    
    $$         
    
    $!        
    $?         0       
    

    위치 매개 변수 도 function 에 사용 할 수 있 습 니 다.
    Difference between echo -e “” and echo $“”
    e 의 뜻 은 확장, 전의 지원, e 와 $가 지원 하 는 기호 부분 이 다르다 는 것 이다.
    * 8727 과 * 와 * 8727 과 @ 의 차이
    작은 따옴표 가 붙 지 않 을 때 는 같 습 니 다. 빈 칸 을 만나면 분리 되 고 작은 따옴표 가 붙 을 때 는 다 릅 니 다. * 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. * 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. 8727 ° 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. @ 입력 한 매개 변 수 를 각각 매개 변수 로 합 니 다. 즉, 입력 할 때의 빈 칸 을 구분 하지 않 습 니 다.
    $@ 자주 사용 합 니 다.
    7. 키보드 입력 읽 기
    read – Read Values From Standard Input
    read a single line of standard input.
    read [-options] [variable…]
    # -n option,suppresses the trailing newline on output
    echo -n "Please enter an integer -> "
    
    read int
    read var1 var2 var3 var4 var5 #   
    
    # -p prompt
    read -p "Enter one or more values > "
    
    # -t seconds
    # -s Silent mode. 
    if read -t 10 -sp "Enter secret passphrase > " secret_pass; 
    

    IFS
    Internal Field Separator
    file_info=$(grep "^$user_name:" $FILE)
    #     ,IFS         command
    IFS=":" read user pw uid gid name home shell <<< "$file_info"
    

    here string
    The <<< operator indicates a here string.
    You Can’t Pipe read
    함수 와 하위 함수 처럼 이런 종류 라면 pip 를 할 수 없습니다.
    Validating Input
    Menus
    특이 하 다
    자주 사용 하지 않 는, 특정 장면 에서 사용 하 는
    Group Commands And Subshells
    Group command:
    { command1; command2; [command3; ...] }
    Subshell:
    (command1; command2; [command3;...])
    

    얘 네 뭐 하 는 애 들 이 야?
    manage redirection
    { ls -l; echo "Listing of foo.txt"; cat foo.txt; } > output.txt
    (ls -l; echo "Listing of foo.txt"; cat foo.txt) > output.txt
    

    결합 pip
    { ls -l; echo "Listing of foo.txt"; cat foo.txt; } | lpr
    

    대괄호 사용 주의
    due to the way bash implements
    group commands, the braces must be separated from the commands by a space and the
    last command must be terminated with either a semicolon or a newline prior to the closing brace.
    group 과 subshell 의 차이
    subshell 은 이름 과 마찬가지 로 돌아 올 때 enviroment 를 잃 어 버 리 기 때문에 일반적으로 group 을 사용 합 니 다.
    echo "foo" | read
    echo $REPLY #    subshell   ,reply   
    

    commands in pipelines are always executed in subshells
    process substitution
    subshell 문 제 를 해결 하 는 데 사용 합 니 다.
    read <<(echo "foo")
    echo $REPLY
    

    좋은 웹페이지 즐겨찾기