쉘 스크립트는 출력 리디렉션과 함께 사용될 때 와일드카드 문자를 해석하지 않습니다.

쉘 스크립트는 출력 리디렉션과 함께 사용될 때 와일드카드 문자를 해석하지 않습니다.

두 개의 스크립트가 있다고 가정해 보겠습니다.

  • 스크립트1.sh:

    #!/bin/bash
    version=2.6
    log_file="$HOME/log-file-version-$version.log"
    
    touch $log_file &>/dev/null
    
    echo "log to my log file from script 1" >> $HOME/log-file-version-?.?.log
    
    gnome-terminal --tab --active --title="script2" --  sh script2.sh
    
  • Script2.sh:

    #!/bin/bash
    
    echo "log to my log file from script 2" >> $HOME/log-file-version-?.?.log
    

난 달린다 script1.sh.

집에 남은 로그 파일은 두 개뿐입니다.

log-file-version-2.6.log
log-file-version-?.?.log

log-file-version-2.6.log포함하다:

스크립트 1에서 내 로그 파일로 로깅

log-file-version-?.?.log포함하다:

스크립트 2에서 내 로그 파일로 로깅

즉, 스크립트 1에서는 >> $HOME/log-file-version-?.?.log7행( )의 와일드카드가 올바르게 해석되지만 이러한 와일드카드를 사용하여 스크립트를 실행하면 sh아무런 효과가 없습니다.

왜 그런 겁니까? 이 문제를 어떻게 해결할 수 있나요?

쉘 스크립트에서 쉘 스크립트로 매개변수를 전달하고 싶지 않고 매개변수가 자체적으로 충분하도록 하기 때문에 와일드카드를 사용해야 합니다.

저는 Ubuntu를 사용하고 있으며 기본 터미널인 gnome-terminal에서 이 스크립트를 실행하고 있습니다.

답변1

bash 매뉴얼에는 이렇게 나와 있습니다.3.6 리디렉션부분:

다음 설명에서 달리 명시하지 않는 한 리디렉션 연산자 뒤에 오는 단어는 중괄호 확장, 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장, 인용 부호 제거,파일 이름 확장자그리고 분사. Bash는 두 단어 이상으로 확장되면 오류를 보고합니다.

sh이러지 마세요: 부터POSIX 쉘 사양

리디렉션 연산자가 " <<" 또는 " <<-"인 경우 [...].다른 리디렉션 연산자의 경우리디렉션 연산자 뒤에 오는 단어는 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장 및 따옴표 제거를 거쳐야 합니다.비대화형 쉘은 단어에 대한 경로 이름 확장을 수행해서는 안 됩니다.대화형 쉘은 이를 수행할 수 있지만 확장 결과가 단어인 경우에만 이를 수행해야 합니다.

$ dash
$ echo foo > *
$ ls
'*'  README.md  ...
$ bash
$ echo bar >> *
bash: *: ambiguous redirect

관련 정보