Como crio um arquivo de script para comandos do terminal?

114

No Windows, posso escrever um arquivo contendo comandos para o cmd (normalmente .cmdou .batarquivos). Quando clico nesses arquivos, ele abre cmd.exee executa os comandos que o arquivo contém.

Como eu faria isso no Ubuntu?

Tenho certeza de que é uma duplicata, mas não consigo encontrar minha resposta.
É semelhante a estas perguntas, mas elas não respondem à pergunta:

Armazene comandos de terminal usados ​​com frequência em um arquivo

Emulador de CMD.exe no Ubuntu para executar o arquivo .cmd / .bat

Seth
fonte

Respostas:

150

Existem dois métodos.

Primeiro, o mais comum é escrever um arquivo, verifique se a primeira linha está

#!/bin/bash

Salve o arquivo. Em seguida, marque-o como executável usandochmod +x file

Então, quando você clicar (ou executar o arquivo no terminal), os comandos serão executados. Por convenção, esses arquivos geralmente não têm extensão, no entanto, você pode fazê-los terminar de .shqualquer outra maneira.

Algumas notas:

  • Qualquer arquivo (e eu quero dizer qualquer) pode ser executado no Linux, desde que a primeira linha seja um caminho para o programa que deve interpretar o arquivo. Exemplos comuns incluem /bin/python, /bin/sh, /bin/dash, mas mesmo estranhas coisas bola trabalhar como/bin/mysql
  • Bash é um idioma completo. É muito mais complexo que o cmd.exe no Windows. Possui uma forte linguagem de programação que suporta funções, loops, condicionais, operações de strings, etc.
  • Esses documentos podem ajudar se você tiver problemas.
  • Se você não deseja tornar o arquivo executável, execute-o passando-o como um argumento para bash: bash file/to/run.sh

Um exemplo simples do Bash

#!/bin/bash  
echo "This is a shell script"  
ls -lah  
echo "I am done running ls"  
SOMEVAR='text stuff'  
echo "$SOMEVAR"

O segundo método é gravar comandos usando script. Corra scripte apenas faça as coisas. Quando você terminar de fazer coisas, o exitscript e o script gerarão um arquivo para você com todas as "coisas" que você fez. Isso é menos usado, mas funciona muito bem para criar coisas como macros. man scriptpara mais informações.

coteyr
fonte
Você pode querer mudar isso /bin/bashpara /bin/sh, bash nem é o padrão para o Ubuntu.
TC1
@ TC1 Está instalado por padrão, então não importa se é o padrão ou não.
Carlos Campderrós
11
Eu gostaria de salientar que /bin/dash(que /bin/shgeralmente é vinculado a um link) é muito mais rápido que o bash (medi aproximadamente 15 vezes mais rápido). Se possível, use /bin/dashpara scripts shell :)
MiJyn
4
Se você estiver na mesma pasta que o arquivo, certifique-se de ./file.sh
coteyr
11
Eu tentei os dois métodos, mas se eu tentar clicar duas vezes no arquivo de script bash, ele abrirá o arquivo de texto no geany / gedit, pronto para edição. Eu gostaria que o script fosse executado com um clique duplo. Esta pergunta contém mais detalhes sobre o que eu quero fazer.
Thymaro 27/04
15

Você quer dizer escrever em um arquivo usando um script de shell? Aqui estão algumas maneiras:

touch file

Esse método simplesmente criará um arquivo, mas se o arquivo já existir, ele simplesmente altera a data da modificação para a hora em que você usou esse comando.

echo "text" > file

Esse método substitui o conteúdo de filepara text. Se você deseja limpar um arquivo, basta fazer o seguinte:

echo "" > file

Digamos que você queira escrever mais de uma linha e não queira usar milhares de echocomandos, você usaria este comando:

cat << EOF > file
test
test1
foo
bar
EOF

Isso permite que você escreva várias linhas em um comando. O conteúdo de fileseria então o seguinte:

test
test1
foo
bar

Se você deseja anexar a um arquivo, substitua >por >>.

Espero que isto ajude!


EDIT : Ah, entendo, então você escreveria o arquivo no gedit, usando a .shextensão (opcional, mas é uma boa ideia) e, em um gerenciador de arquivos, clique com o botão direito do mouse no arquivo, selecione Propriedades-> Permissões e verifique Allow executing file as program. Então você pode clicar duas vezes nele e ele será executado :). Além disso, se você quiser fazer isso no terminal, poderá executar este comando para torná-lo executável (você pode querer acrescentar sudose não lhe pertencer):

chmod +x file

E para correr:

./file
MiJyn
fonte
Na verdade, o que eu quero fazer é escrever um arquivo, digamos gedit, que contenha comandos de terminal. Então, quando eu clicar duas vezes neste arquivo, ele executará esses comandos no terminal.
Seth
Ótima resposta, atualização atenciosa. Para simplesmente criar um arquivo, eu sempre usei apenastouch filename
TryTryAgain
@TryTryAgain, sim, esse é um método fácil, provavelmente mais rápido que echo "" > file. Tudo bem se eu incluir esse método na minha resposta?
MiJyn
@MiJyn Absolutamente incluí-lo, fique à vontade. Obrigado
TryTryAgain
Como posso rodar em qualquer lugar no terminal ... como um comando global?
Omer
14

O equivalente aos arquivos em lote do Windows são scripts de shell, e um excelente guia de introdução é o Bash Scripting .

Na maioria das vezes, os comandos que você pode inserir na linha de comando podem ser colocados em um script de shell.

Algumas coisas diferentes dos arquivos em lotes do Windows:

  • Existem diferentes interpretadores de comando, chamados shells. O padrão é bash, mas se você estiver interessado, existem outros, como zsh, ksh, dash, perl, python, etc.

  • Para executar um script de shell, você precisa tornar o arquivo executável, o que você pode fazer com chmod +x <filename>

  • No Ubuntu, o diretório atual não é o caminho de pesquisa do programa, portanto, você precisa executar ./<filename>, não<filename>

  • Os nomes de variáveis ​​são $<varname>, não%<varname>%

  • Os comandos em um script de shell não são impressos por padrão, como em um arquivo em lotes.

  • A extensão do nome do arquivo pode ser .shou (mais comum) você não precisa usar uma extensão. Coloque #!/bin/basha primeira linha do arquivo , que informa ao Ubuntu qual programa usar para executar o arquivo.

  • Os comentários começam com #, não rem.

Espero que isso ajude e divirta-se com scripts!

Acredito
fonte