O script sh do Linux lança “#! / bin / sh: not found”

1

eu tenho um script

#!/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

mas quando tento executá-lo, recebo este erro: /root/transmission_r.sh: 1: /root/transmission_r.sh: #! / bin / sh: not found

    
por Nojus741 01.08.2015 / 12:58

1 resposta

10

Seu script começa com:

#!/bin/sh

Este não é um comentário, mas um shebang para dizer ao seu sistema operacional para usar /bin/sh para execute o script. Mas aparentemente o Ubuntu não consegue encontrá-lo.

  • Se ls /bin/sh não mostrar resultado, então acho que isso precisa ser corrigido. Como uma solução temporária, você pode ter sorte que seu script também funcione, por exemplo, bash:

    #!/bin/bash
    
  • Se /bin/sh existir (como deveria), então o Ubuntu não consegue interpretar essa primeira linha. Despeje-o como hexadecimal:

    head -n 1 myscript.sh | hexdump -C
    
    00000000  ef bb bf 23 21 2f 62 69  6e 2f 73 68 0d 0a        |...#!/bin/sh..|
    

    E com o resultado:

    • Certifique-se de que os finais de linha estão usando o formato Unix, LF ( \n ou hexadecimal 0a ) em vez de, por exemplo, o padrão CRLF do Windows ( \r\n ou hexadecimal 0d0a no exemplo acima). Em um Mac, isso causaria um erro diferente:

      /bin/sh^M: bad interpreter: No such file or directory
      
    • Certifique-se de que as codificações de arquivos não estraguem, como uma lista de materiais (Unicode) (invisível) do Unicode ( ef bb bf no exemplo de saída acima). No exemplo acima, seu shell não está vendo um comentário ou o shebang, mas está tentando executar um comando que começa com 3 caracteres invisíveis. Nesse caso, seu shell provavelmente ainda executaria as próximas linhas ou poderia até mesmo concluir o script com êxito. Em um Mac, a primeira linha realmente é lançada:

      ./myscript.sh: line 1: #!/bin/sh: No such file or directory
      

Para despejar a mensagem de erro para ver os caracteres invisíveis nessa mensagem, é necessário redirecionar a saída de erro para a saída padrão:

./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.|
    
por 01.08.2015 / 13:17