O jeito mais fácil de escrever e executar um Shell Script no Linux
Missão: escrever um programa fácil em shell script e ver o resultado.
Obs.: é possível executar um programa feito em shell script estando ele hospedado em qualquer lugar do sistema, bastando para isso, indicar seu caminho absoluto; porém, nosso foco aqui é o jeito mais fácil, para quem quer realmente escrever seu primeiro programa em shell script e ver o resultado.
I. A primeira etapa é saber onde estou com o comando pwd. Porque a execução do arquivo ocorrerá no local onde você está, a autorização para o programa executar também vai levar em consideração o local onde você está.
Portanto, ao abrir o shell (ou terminal em algumas distribuições do Linux) digitar o seguinte comando:
pwd $ /home/Meu_Nome
O significado de pwd é: print work directory (imprima o diretório atual)
II. O que vai diferenciar um arquivo de texto de um script? A simples extensão .sh, então não podemos esquecer de salvar o arquivo de texto de forma correta e no local correto.
O arquivo de texto poderá ser escrito em qualquer editor de texto, como o Gedit.
Texto:
#!/bin/bash
echo " Escreva Qualquer Coisa Entre As Aspas"
Nosso programa de teste possui apenas as duas linhas acima.
III. Salvar o texto como "meu_script.sh" e verificar se o local onde ele será salvo é realmente o local que foi informado pelo comando pwd. No nosso exemplo, o local a salvar o arquivo "script.sh", seria /home/Meu_Nome.
IV. Scripts que não são perigosos, como este exemplo, recebem permissão para que todos possam acessar. Comando:
chmod a+x meu_script.sh
Onde:
"meus_script.sh": é o nome do script;
"a" significa: all
E "+x", significa "execute". Ou seja, todos recebem permissão para executar o "meu_script.sh".
Comando só para mim executar "meu_script.sh":
chmod u+x meu_script.sh
V. Se eu realmente salvei no local onde estou digitando no shell (pwd), não esqueci de colocar a extensão ".sh", e dei a permissão "x" para o arquivo ser executado como programa. Então, o resultado será apresentado apenas escrevendo o nome do programa no shell e pressionando o Enter.
Comando:
meu_script.sh
Resultado: $ Escreva Qualquer Coisa Entre As Aspas
No caso do exemplo, o programa se chama "meu_script.sh", caso tenha dado outro nome ao programa, é só digitar seu nome e verificar o resultado.
[2] Comentário enviado por pherde em 30/07/2016 - 09:57h
II. O que vai diferenciar um arquivo de texto de um script? A simples extensão .sh, então não podemos esquecer de salvar o arquivo de texto de forma correta e no local correto.
Não é bem assim..... extensão é coisa de windows, linux não precisa necessariamente de extensão. Um script é um arquivo texto, com código, e com permissão de execução. Se você salvar o arquivo que você exemplificou na dica como "meu_script" (sem .sh) e dar permissão para executar irá funcionar. Claro, por questão de organização é sempre bom colocar um .sh no final do nome do arquivo para saber posteriormente que se trata de um script.
[3] Comentário enviado por Oldy_Boy em 30/07/2016 - 12:23h
ISSO Rafael,
parabéns pelo comentário, faltou um ./ (ponto barra indicando que estamos indicando o diretório atual).
Muitas vezes precisamos indicar o diretório atual com o ./ quando o caso é shell script !
ex: ./MeuScript.sh
Se depois de seguir o procedimento o script não rodar e você tiver certeza de que você e o script estão
no mesmo local é só colocar o ./ antes do nome do programa, enter, e o shell script rodará.
Obs: O mesmo não ocorre com outros comandos, ex: cd Downloads (forma correta), se eu digitar cd ./Downloads pode ser que não funcione, isso porque cd é um programa e espera apenas um nome
como argumento(resposta para o programa/função).
Por isso parabéns, você achou o erro.
Pherde,
Em relação a extenção, todos os arquivos linux possuem uma extenção que nem sempre é mostrada, porém existem. A extensão dos arquivos pode ser obtida com o comando: file
Exemplo:
$ file arq1
saída:
arq1: PDF document, version 1.5
[4] Comentário enviado por pherde em 30/07/2016 - 18:17h
Pherde,
Em relação a extenção, todos os arquivos linux possuem uma extenção que nem sempre é mostrada, porém existem. A extensão dos arquivos pode ser obtida com o comando: file
Exemplo:
$ file arq1
saída:
arq1: PDF document, version 1.5
Não cara, o comando 'file' serve para determinar o tipo de arquivo ("$man file" mostra exatamente isso), não a extensão. De um file em meu_script.sh, irá aparecer que ele é de extensão .sh? Não, irá aparecer seu tipo, texto ASCII. Tire o .sh do arquivo e novamente de um file nele, a resposta será a mesma "ASCII text". Veja numa imagem, de um file com e sem extensão, seu tipo não irá alterar, a extensão não importa para designar o tipo de arquivo.
A extensão de um arquivo, no linux, é apenas um sufixo que compõe o nome. Faça um script em shell, em python, em ruby, em pearl, a extensão não é determinante para que os scripts sejam executados, mas sim sua permissão.
[5] Comentário enviado por removido em 30/07/2016 - 20:25h
Como o colega @pherde já demonstrou, importante não confundir EXTENSÃO com TIPO. O comando file retorna o tipo de arquivo, enquanto a extensão é apenas um sufixo após o ponto (.) no nome do arquivo, que em sistemas Unix-like é indiferente.
A extensão é útil para ambientes gráficos, necessário apenas para identificar o aplicativo associado para que o usuário possa abrir o arquivo com um duplo (ou único) clique. Mas na prática, um arquivo do TIPO "mp3" com extensão ".mp3" é o mesmo tipo de arquivo que um outro arquivo do TIPO "mp3" com extensão ".txt", por exemplo.
--
Linux User: #596371
[6] Comentário enviado por EmersonPrado em 30/07/2016 - 20:47h
[3] Comentário enviado por Oldy_Boy em 30/07/2016 - 12:23h
Muitas vezes precisamos indicar o diretório atual com o ./ quando o caso é shell script !
Usar ./ não tem a ver com ser shell script. O Linux procura executáveis (shell scripts ou quaisquer outros) na variável de ambiente PATH. Então, se seu executável não estiver no PATH, o Linux não executa. O ponto-barra serve para indicar o caminho do executável: o ponto significa diretório atual e a barra, naturalmente, separa o diretório do nome do arquivo.
Então, a regra é: ao executar qualquer programa, se o mesmo estiver no PATH, basta usar o nome do executável. Caso contrário, é necessário indicar o caminho completo - que, no caso do diretório atual, é "./<Executável>".
Obs: O mesmo não ocorre com outros comandos, ex: cd Downloads (forma correta), se eu digitar cd ./Downloads pode ser que não funcione, isso porque cd é um programa e espera apenas um nome
como argumento(resposta para o programa/função).
Sim, funciona. "cd ./Downloads" significa "vá para o diretório Downloads dentro do diretório atual". Apenas não é necessário pois, como "Downloads" não é o executável, não há a restrição do "PATH" que eu citei acima.
Em relação a extenção, todos os arquivos linux possuem uma extenção que nem sempre é mostrada, porém existem. A extensão dos arquivos pode ser obtida com o comando: file
Se procurar na sua máquina, vai cair pra trás com a quantidade de arquivos sem extensão no nome. /etc/hosts, /var/log/messages e /opt/firefox/firefox são apenas alguns pouquíssimos exemplos. O Linux ignora extensões sumariamente - "script.sh" é apenas um nome que contém um ponto.
O programa file, como o pherde bem observou, também ignora a extensão (por ela ser irrelevante para o Linux). Experimente renomear seu script para script.bin, script.html, script.so, script.www.vivaolinux.com.br, etc. e execute o file em cada um deles (e execute o script também). O file identifica o tipo de arquivo pelo conteúdo.
Então, outra regra: extensão de nome de arquivo é uma informação utilizadas por nós, humanos, e não pelo Linux.
[7] Comentário enviado por removido em 01/08/2016 - 11:40h
Olá! Muito legal essa dica! Parabéns ao autor!
Sugestão: existe algum jeito de adicionar na dica as informações presentes nos comentários? Tem muita informação boa por aqui, e nem todo mundo lê os comentários das dicas e artigos. Se aparecessem no texto, iria ficar mais visível (e iria aparecer na hora de imprimir também).
[8] Comentário enviado por conectadohost em 03/08/2016 - 18:01h
[1] Comentário enviado por Rapha_Henrique em 29/07/2016 - 16:48h
Boa abordagem, só uma correção, para executar o script, é preciso utilizar "./" antes do nome do script
$ ./meu_script.sh
Olá,
nem sempre
basta que o script esteja dentro da /bin e com o path
#!/bin/bash
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin
desse modo o script pode ser executado em qualquer local sem precisar do ./
somente digitando o nome do script meuscript.sh desse modo é muito mais pratico.
[9] Comentário enviado por Raphael_Henrique em 03/08/2016 - 18:30h
Olá,
nem sempre
basta que o script esteja dentro da /bin e com o path
#!/bin/bash
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin
desse modo o script pode ser executado em qualquer local sem precisar do ./
somente digitando o nome do script meuscript.sh desse modo é muito mais pratico.
Olá, sim, estou ciente disso. Acontece que o meu comentário foi seguindo a abordagem do autor da dica, que utilizou a execução do script como em uma pasta local. Eu não estava generalizando, mas se passei essa impressão, obrigado por me corrigir