두 개의 스크립트가 있다고 가정해 보겠습니다.
스크립트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-?.?.log
7행( )의 와일드카드가 올바르게 해석되지만 이러한 와일드카드를 사용하여 스크립트를 실행하면 sh
아무런 효과가 없습니다.
왜 그런 겁니까? 이 문제를 어떻게 해결할 수 있나요?
쉘 스크립트에서 쉘 스크립트로 매개변수를 전달하고 싶지 않고 매개변수가 자체적으로 충분하도록 하기 때문에 와일드카드를 사용해야 합니다.
저는 Ubuntu를 사용하고 있으며 기본 터미널인 gnome-terminal에서 이 스크립트를 실행하고 있습니다.
답변1
bash 매뉴얼에는 이렇게 나와 있습니다.3.6 리디렉션부분:
다음 설명에서 달리 명시하지 않는 한 리디렉션 연산자 뒤에 오는 단어는 중괄호 확장, 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장, 인용 부호 제거,파일 이름 확장자그리고 분사. Bash는 두 단어 이상으로 확장되면 오류를 보고합니다.
sh
이러지 마세요: 부터POSIX 쉘 사양
리디렉션 연산자가 "
<<
" 또는 "<<-
"인 경우 [...].다른 리디렉션 연산자의 경우리디렉션 연산자 뒤에 오는 단어는 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장 및 따옴표 제거를 거쳐야 합니다.비대화형 쉘은 단어에 대한 경로 이름 확장을 수행해서는 안 됩니다.대화형 쉘은 이를 수행할 수 있지만 확장 결과가 단어인 경우에만 이를 수행해야 합니다.
$ dash
$ echo foo > *
$ ls
'*' README.md ...
$ bash
$ echo bar >> *
bash: *: ambiguous redirect