スクリプトがあります
#!/bin/sh
# Automatically remove a torrent and delete its data after a specified period of
# time (in seconds).
TARGET=/var/www/transmission/completed
USER=name
PASS=pass
BIN="/usr/bin/transmission-remote"
# The default is 5 minutes (in seconds).
CUTOFF=`expr 100 \* 3`
##############################################
### You shouldn't need to edit below here. ###
##############################################
# Tokenise over newlines instead of spaces.
OLDIFS=$IFS
IFS="
"
for ENTRY in `$BIN -n $USER:$PASS -l | grep 100%.*Done.*Finished`; do
# Pull the ID out of the listing.
ID=`echo $ENTRY | sed "s/^ *//g" | sed "s/ *100%.*//g"`
# Determine the name of the downloaded file/folder.
NAME=`$BIN -n $USER:$PASS -t $ID -f | head -1 |\
sed "s/ ([0-9]\+ files)://g"`
# If it's a folder, find the last modified file and its modification time.
if [ -d "$TARGET/$NAME" ]; then
LASTMODIFIED=0
for FILE in `find $TARGET/$NAME`; do
AGE=`stat "$FILE" -c%Y`
if [ $AGE -gt $LASTMODIFIED ]; then
LASTMODIFIED=$AGE
fi
done
# Otherwise, just get the modified time.
else
LASTMODIFIED=`stat "$TARGET/$NAME" -c%Y`
fi
TIME=`date +%s`
DIFF=`expr $TIME - $LASTMODIFIED`
# Remove the torrent if its older than the CUTOFF.
if [ $DIFF -gt $CUTOFF ]; then
date
echo "Removing $NAME with ID:$ID"
$BIN -n $USER:$PASS -t $ID --remove-and-delete
fi
done
IFS=$OLDIFS
しかし、実行しようとすると、次のエラーが発生します:/root/transmission_r.sh:1:/root/transmission_r.sh:#!/ bin/sh:not found
スクリプトは次で始まります:
#!/bin/sh
これはコメントではありませんが、 Shebang は、オペレーティングシステムに/bin/sh
を使用してスクリプトを実行するように指示します。しかし、どうやらUbuntuはそれを見つけることができません。
ls /bin/sh
に結果が表示されない場合は、修正する必要があると思います。一時的な解決策として、スクリプトがbashなどでも機能するのは幸運かもしれません。
#!/bin/bash
/bin/sh
doesが存在する場合(あるべきように)、何らかの理由でUbuntuは最初の行を解釈できません。 16進数としてダンプします。
head -n 1 myscript.sh | hexdump -C
00000000 ef bb bf 23 21 2f 62 69 6e 2f 73 68 0d 0a |...#!/bin/sh..|
そしてその結果:
行末がUnix形式のLF(\n
または16進数0a
)を使用していることを確認してください。たとえば、Windows標準のCRLF(\r\n
または上記の例では16進数の0d0a
)。Macでは、これは実際には別のエラーをスローします。
/bin/sh^M: bad interpreter: No such file or directory
(非表示の)Unicode [〜#〜] bom [〜#〜] (上記の出力例ではef bb bf
)のように、ファイルエンコーディングがめちゃくちゃにならないようにしてください。上記の例では、シェルはコメントやシバンを見ていませんが、3つの非表示文字で始まるコマンドを実行しようとしています。この場合、シェルはおそらく次の行を実行するか、スクリプトを正常に完了する可能性があります。 Macでは、最初の行が実際にスローされます。
./myscript.sh: line 1: #!/bin/sh: No such file or directory
エラーメッセージをダンプして、そのメッセージに表示されない文字を表示するには、エラー出力を標準出力にリダイレクトする必要があります。
./myscript.sh 2>&1 | hexdump -C
00000000 2e 2f 6d 79 73 63 72 69 70 74 2e 73 68 3a 20 6c |./myscript.sh: l|
00000010 69 6e 65 20 31 3a 20 ef bb bf 23 21 2f 62 69 6e |ine 1: ...#!/bin|
00000020 2f 73 68 3a 20 4e 6f 20 73 75 63 68 20 66 69 6c |/sh: No such fil|
00000030 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 0a |e or directory.|