
cat
/ 의 출력을 기반으로 Python 파일을 실행하고 있습니다 awk
. 다음과 같은 파일이 있다고 가정 해 봅시다.
samp.txt
:
test.py test.conf
dev.py dev.conf
지금은 파일이고 Python 스크립트를 트리거하는 cat
작은 쉘 스크립트가 있습니다.samp.txt
samp.sh
:
OLDIFS=$IFS; IFS=$'\n';for file in $(cat samp.txt) ;
do
text="$file -c $1 -s $2 -t $3"
out=`python $text`
done
쉘 스크립트를 실행하면 다음과 같이 나타납니다.
python: can't open file 'test.py test.conf' : [Errno 2] No such file or directory
문제는 작은따옴표 때문입니다. 그것을 극복하려면 조언이 필요합니다.
답변1
문제는 작은 따옴표 때문이 아니라(오류 출력에 표시된 작은 따옴표를 참조하고 있다고 가정합니다. 이는 오류를 표시하는 Python의 방식일 뿐입니다) 오히려 분할할 셸에 의존하기 때문입니다 $text
. 공백을 별도의 단어로 분리합니다. 또한 IFS
루프 앞의 변수에서 공백 문자를 제거했습니다. 이는 쉘이 분할을 올바르게 수행할 수 없음을 의미합니다.
올바른 해결책은아니요쉘을 $text
공백으로 분할하도록 하십시오. 이렇게 하면 결과 단어에 대해 파일 이름 와일드카드가 계속 호출됩니다. , 및 $text
가 포함되어 있기 때문에 이러한 값은 분할 시 공백 등으로 분할됩니다.$1
$2
$3
$text
변수를 올바르게 분할하기 위해 쉘에 의존하는 대신 루프에서 $text
한 줄에 두 단어를 읽으십시오 .samp.txt
while
while read -r script config; do
out=$( python "$script" "$config" -c "$1" -s "$2" -t "$3" )
done <samp.txt
인수에 별도의 변수를 사용하고 예를 들어 bash
명명된 배열이 있는 다른 쉘을 사용하는 경우:
args=( -c "$1" -s "$2" -t "$3" )
while read -r script config; do
out=$( python "$script" "$config" "${args[@]}" )
done <samp.txt
텍스트 문자열 대신 배열을 매개변수로 사용하면 매개변수가 배열에서 적절하게 분리될 수 있습니다. 확장은 "${args[@]}"
배열의 개별 요소가 되며 각 요소는 올바르게 참조됩니다. 이는 예를 들어 $1
, $2
및 $3
공백 등을 문제 없이 포함할 수 있음을 의미합니다.
POSIX( /bin/sh
) 스크립트에서는 위치 인수를 안전하게 버릴 수 있다고 가정합니다 $4
.
set -- -c "$1" -s "$2" -t "$3"
while read -r script config; do
out=$( python "$script" "$config" "$@" )
done <samp.txt