Logo Hardware.com.br
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#2 Por vini_bill
09/09/2006 - 02:52
mais ou menos. Contanto que o executavel seja um script não há diferença.

Agora se você tiver um programa acho que não vai funcionar.

tente fazer o seguinte. Vá até /bin e lá digite:

sh ls


Viu o resultado?

Agora rode um script qualquer:

sh nome_do_script


Viu o resultado?

... Vinicius Menezes ...

P.s.: O resultado do primeiro exemplo na minha máquina é:
bash-3.1$ sh ls
ls: ls: cannot execute binary file
bash-3.1$


eu não tenho um script para executar na minha máquina ( nem sei fazer um... ) mas provavelmente o script rodaria.
Ricardo Guimarães
Ricardo Guim... Veterano Registrado
1.3K Mensagens 5 Curtidas
#4 Por Ricardo Guim...
09/09/2006 - 04:42
Aí, fiz um teste aqui seguindo seu raciocínio, vini. Também não sei fazer scripts, mas fiz um só com o #! /bin/bash e um echo.
Ok, script criado com o nome "teste", tentei:
$ sh teste - rodou
$ ./teste - permissão negada
com chmod +x teste:
$ ./test - rodou

Neoblink tem razão, não precisa dar permissão de execução pro script ao usar o sh. Mas, e aí? Será só essa a diferença? E por que existe os 2 então?
Aguardemos um entendido do assunto, e valeu pelas respostas! :mrgreen:

joaonadal
joaonadal Super Participante Registrado
740 Mensagens 0 Curtidas
#6 Por joaonadal
09/09/2006 - 09:14
sh é um interpretador de comandos. Do "man sh"

The sh utility is a command language interpreter that shall execute commands read
from a command line string, the standard input, or a specified file. The application
shall ensure that the commands to be executed are expressed in the language
described in Shell Command Language .

Já o './' é um operador do bash, a shell padrão do linux, que permite executar programas mesmo que esses não tenham permissão de execução.

Se não me engano, é isso.

Nadal
pulsar
pulsar Membro Senior Registrado
342 Mensagens 4 Curtidas
#8 Por pulsar
09/09/2006 - 11:08
sh é um comando que na verdade é um link simbólico para bash nos Linuxes que há por aí. Quando bash é chamado através desse link ele tenta emular o comportamento do Bourne shell (SH) clássico. BASH, para quem não sabe, é BOURNE AGAIN SHELL, um trocadilho sobre a expressão BORN AGAIN e o nome -- STEVE BOURNE -- do criador do shell original do UNIX, já que ele, o BASH, é uma versão aprimorado do SH tradicional.

Quando você digite sh script.sh o que o shell atual faz é simplesmente dar um fork() (digite man fork para saber mais) e executar o comando sh, ou seja, ele cria outro shell. Esse shell filho recebe os argumentos -- script.sh, neste caso -- do shell parente. O shell filho detecta que script.sh é um shell script e executa os comandos que estão contidos no arquivo seqüencialmente. É a mesma coisa que digitar source script.sh ou . ./script.sh, só que nesse caso é o shell atual que irá processar e rodar seqüencialmente os comandos contidos no arquivo.

Reparem no . ./script.sh. Há dois pontos. O primeiro é um "sinônimo" para o builtin* source. Há uma diferença entre source e . que não me lembro agora. Parece que um é o padrão no SH tradicional e o outro uma extensão do BASH. Dêem um info bash no shell e vão em "SHELL BUILTIN COMMANDS" que lá ele explica essas diferenças.

* builtin é um termo que designa um programa embutido no shell.

"." também pode significar simplesmente o atual diretório, o diretório onde você se encontra no momento. O parser do BASH sabe diferenciar isso. Como? Simples, "." no começo da linha de comando só pode ser um comando a ser executado. Um "." após o primeiro argumento só pode ser a expressão que representa o diretório atual. Existe também a expressão ".." que representa o diretório superior.

OBS.: reparem que eu usei . para me referir ao comando e "." para me referir à expressão.

Exemplo do que eu digo:

$ cat .
cat: .: Is a directory


Viram aquele .: Is a directory ali?

Outro exemplo mais iluminador: dêem ls -a num shell. Ele irá listar os arquivos "." e ".." que são as expressões que descrevi.

Pronto, acho que isso é tudo. :mrgreen:
angeloshimabuko
angeloshimab... Veterano Registrado
933 Mensagens 67 Curtidas
#9 Por angeloshimab...
09/09/2006 - 16:57
"." e ".." são apelidos (aliases) para nomes de diretórios. O "." identifica o diretório corrente; ".." identifica o diretório pai. "." _não_ é um comando (com ou sem aspas). O "." no início de um nome de arquivo ou pasta indica um arquivo ou pasta oculto(s).

Para executar um comando, as variáveis de ambiente consideram que o interpretador padrão de comandos é o sh. Normalmente, nas instalações Linux, o sh é um link simbólico para /bin/bash. Quando o usuário digita uma palavra qualquer num prompt, por exemplo:

$ comando

está sendo informado ao interpretador de comandos (bash, por exemplo), que deve executar "comando". Por padrão, "comando" será um arquivo executável que deverá existir num dos diretórios listados na variável de ambiente PATH (verifiquem com o comando "$ env|grep PATH "). Caso o "comando" não seja encontrado naqueles diretórios, ocorrerá um erro "bash: comando: command not found". Caso "comando" seja um arquivo executável no diretório de trabalho atual, que não esteja listado no PATH, dever-se-á usar a sintaxe: "$ ./comando ". O "./" indica para o interpretador de comandos que o arquivo executável está no diretório de trabalho atual (desculpem a redundância, é para salientar).
Marcelo de Matos Soeiro
Marcelo de M... Super Zumbi Registrado
13.3K Mensagens 159 Curtidas
#11 Por Marcelo de M...
10/09/2006 - 10:58
JoaoNadal, meu querido, complementando, um arquivo tem que ter permissões de execução, sim, para usar o './'. Mas, como bem colocado pelo Angeloshimabuko, apenas para executáveis locais, que não são executados normalmente, se estiverem fora da variável de ambiente path. Digamos que tenha um executável 'arquivo' em certa pasta e você esteja no terminal nesta pasta. Se digitar simplesmente 'arquivo', nada acontece, pois ele procura esse arquivo no path. Temos que explicitar que o executável está na pasta corrente, o que é feito com o './'. Aliás, isso é exatamente o que o Angeloshimabuko falou, apenas com outras palavras...
Fiquem com Deus.
Mandriva 2010.2 | GNOME 2.30 | Xfce 4.6.1 | KDE 4.5.5
Linux User 169925
E há de ser que todo aquele que invocar o nome do Senhor será salvo; (Jl 2:32)
angeloshimabuko
angeloshimab... Veterano Registrado
933 Mensagens 67 Curtidas
#12 Por angeloshimab...
10/09/2006 - 12:15
Ricardo, voltando à sua primeira questão.

(i) Usar o comando "$ sh nome" significa que você vai usar um programa (sh, que é um link simbólico para /bin/bash, geralmente), que vai interpretar os comandos contidos no arquivo "nome". Neste caso, esse arquivo deve conter comandos executáveis. Não precisa ser um script, nem conter as flags de execução (755, p.ex.). E não irá executar um arquivo binário, apenas arquivos-texto que contenham comandos bash.

(ii) "$ ./nome" indica para o interpretador de comandos padrão (normalmente o bash), para executar o comando (um script _ou_ um binário executável) cujo nome é "nome" e encontra-se no diretório atual. No DOS, o diretório atual faz parte do PATH, assim não é necessário o nome do caminho. No Linux (e nos Unices em geral), o diretório corrente _não_ é incluído no PATH, por questão de segurança; assim é obrigatório usar o nome do caminho ("./" neste caso) para executar o comando.
pulsar
pulsar Membro Senior Registrado
342 Mensagens 4 Curtidas
#13 Por pulsar
10/09/2006 - 14:25
O . é um comando também.

Retirado de info bash:

`.    (a period)'
. FILENAME [ARGUMENTS]
Read and execute commands from the FILENAME argument in the
current shell context. If FILENAME does not contain a slash, the
`PATH' variable is used to find FILENAME. When Bash is not in
POSIX mode, the current directory is searched if FILENAME is not
found in `$PATH'. If any ARGUMENTS are supplied, they become the
positional parameters when FILENAME is executed. Otherwise the
positional parameters are unchanged. The return status is the
exit status of the last command executed, or zero if no commands
are executed. If FILENAME is not found, or cannot be read, the
return status is non-zero. This builtin is equivalent to `source'.


Destacando:

Read and execute commands from the FILENAME argument in the current shell context. (...) This builtin is equivalent to `source'.


Exemplificando:

$ echo 'echo oi' > script.sh
$ ./script.sh
-sh: ./script.sh: Permission denied
$ . ./script.sh
oi
$ source ./script.sh
oi
$
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal