cat/awk 출력을 기반으로 쉘 스크립트에서 Python 파일 실행

cat/awk 출력을 기반으로 쉘 스크립트에서 Python 파일 실행

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.txtwhile

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

관련 정보