Por que meu script não funciona?

2

Estou ficando mais confortável com o terminal no Mac OSX e achei que seria interessante usar scripts bash. Não querendo rastejar antes que eu pudesse sentar, eu queria escrever um incrivelmente simples "Olá, mundo!" script então eu fiz isso:

~/Desktop touch hello.sh
~/Desktop vim hello.sh

Eu adicionei isso ao hello.sh

#!/bin/bash
echo "Hello, world!"

Eu então fiz isso:

~/Desktop chmod -x hello.sh
~/Desktop hello

Em que ponto nada aconteceu.

Eu tinha baixado um script bash igualmente simples de algum lugar assim:

#!/bin/bash
echo "The current date and time."
date

E quando eu fiz

~/Desktop date

ele fez exatamente o que deveria.

Então, verifiquei as permissões de arquivo com ls -l e recebi isso:

-rw-r--r--    1 Mike  staff       33  5 Sep 21:13 hello.sh
-rw-r--r--@   1 Mike  staff       50  5 Sep 21:00 date.sh

Então, claramente, o @ está fazendo toda a diferença, ou assim pensei. Em vez de usar o vim, criei o mesmo arquivo no TextEdit e, após passar pelos mesmos movimentos de antes, acabei com a mesma situação, ou seja, meu script não fazia nada, exceto que agora as permissões mostravam um @ no final delas.

Então, minhas perguntas são por que isso não está funcionando, o que estou fazendo de errado? E qual é o @ no final das permissões?

    
por MrMisterMan 05.09.2011 / 22:28

1 resposta

8

Primeiro, você deve adicionar o bit de permissão "executar". Usando chmod +x adiciona, chmod -x remove.

Segundo, no Unix você deve usar o nome do arquivo exato . Se o arquivo tiver o nome hello.sh , você deverá executá-lo por hello.sh , não hello . (Você provavelmente está acostumado com o Windows e seu% PATHEXT%, que não existe no Unix. Aqui, apenas o bit de execução é considerado e .sh é insignificante para o sistema - o arquivo pode ser nomeado simplesmente hello se você quiser.)

Terceiro, por padrão, o diretório atual é não pesquisado por comandos (por motivos de segurança). O script deve estar localizado em seu $ PATH ou você deve executá-lo pelo nome completo do caminho. Usar . (que significa "o diretório atual") será suficiente.

~/Desktop chmod +x hello.sh
~/Desktop ./hello.sh
Hello, world!
~/Desktop ~/Desktop/hello.sh
Hello, world!
~/Desktop

( ./hello.sh significa " hello.sh no diretório atual".)

Quando você digitou date , você não executou seu próprio script; você executou o comando date do sistema (assim como você executa o comando chmod do sistema quando digita chmod ). O @ não faz fazer a diferença aqui.

O caractere @ indica simplesmente a presença de "metadados estendidos" associados a esse arquivo; provavelmente algo específico para o TextEdit. De acordo com o ls (1) página de manual, você pode usar ls -l -@ ( ls -l@ ) para ver os metadados.

    
por 05.09.2011 / 22:41