"모호한 리디렉션"은 텍스트를 변수로 리디렉션하는 데 사용됩니다.

"모호한 리디렉션"은 텍스트를 변수로 리디렉션하는 데 사용됩니다.

누군가가 프로그램에 소비하는 시간을 제한하기 위해 쉘 스크립트를 만들고 있는데 다음과 같은 오류가 발생합니다.

./time_limit: line 26: $Log: ambiguous redirect
./time_limit: line 16: [: root: unary operator expected

코드는 다음과 같습니다.

#!/bin/bash
config (){
ImageViewer=/ 2> /dev/null 
AllowedTime=30 #in minutes
AllowedPlays=1
cmd=sol #for demonstration, I use sol installed by default in Ubuntu. Set to your liking
AllowedUser=root #Set to your liking.
ImageViewer=eog #I set this to the Eye of GNOME image viewer. If no GUI or if you don't want an explosion (really?) comment out.
#If you have another desktop change to yor image viewer.
Log=/dev/null #if you want to log this, set to file of your liking
#but make sure you have write permission.
config
date=$(date)

}
if [ $USER = $AllowedUser ]
then 
    echo "ACSESS ALLOWED for $AllowedTime minutes."
        at now + $AllowedTime minutes <<< "killall $cmd; $ImageViewer ../files/Explode.gif"
    echo "Session 1: $date" >> $Log
    $cmd
    exit
fi
echo "ACSESS DENIED!"
echo "This UNAUTHORIZED USE has ben recorded."
echo "Violation by $USER $date" >> $Log

ShellCheck를 통해 실행했는데 괜찮아 보입니다. 누구든지 문제를 볼 수 있습니까?

답변1

이 코드 조각에서는 함수 config()가 실제로 호출되지 않으므로 실행되지 않습니다. 따라서 이러한 변수는 설정되지 않습니다. 의도했지만 실수로 호출을 자체 config내부에 넣어서 config무한 재귀 함수로 만든 것 같습니다.

을 호출해야 config하지만 모든 변수를 인용해야 합니다.

$ unset foo
$ [ $USER = $foo ]
-bash: [: jesse_b: unary operator expected
$ [ "$USER" = "$foo" ]
$ echo foo >> $foo
-bash: $foo: ambiguous redirect
$ echo foo >> "$foo"
-bash: : No such file or directory

$foo위의 예에서 설정되지 않은 변수로 리디렉션하면 변수가 인용되지 않은 경우 셸에서 "모호한 리디렉션" 오류가 발생합니다. 해결 방법은 변수가 설정되었는지 확인하고( config귀하의 경우 올바르게 호출하여) 모든 확장명을 참조하는 것입니다.

또는 옵션을 설정하는 것 nounset(또는 shebang에서 /에 옵션을 추가하는 것)은 초기화되지 않았을 때 변수가 확장되는 상황을 식별하는 데 도움이 될 수 있습니다.set -o nounsetset -u-ushbash

스크립트를 적절하게 들여쓰는 것도 여기서 문제를 식별하는 데 도움이 될 수 있습니다.

관련 정보