O jeito mais fácil de escrever e executar um Shell Script no Linux

Publicado por Daniel Oliveira Leal em 29/07/2016

[ Hits: 25.910 ]

 


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.

Outras dicas deste autor

Gedit - Como corrigir erros de acentuação em códigos HTML ou PHP

Como corrigir erros de acentuação em códigos HTML, PHP ou JavaScript

Leitura recomendada

Conhecendo o printf

Aulas Shell Script do zero - Parte 8

Performance awk x grep

Automatização da instalação do plugin JAVA (Mozilla)

Reexecutando comandos do console

  

Comentários
[1] Comentário enviado por Raphael_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

[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.

Abraços,
Emerson

[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).

Falou!

[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



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts