Existe uma maneira de criar um script e torná-lo executável em menos código que isso?

8

Meu código para criar um script executável

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Sham Fiorin
fonte
2
@ShamFiorin Eu queria enfatizar a primeira parte da resposta de sobremesas. Você deve tentar usar sudocom moderação. Adquirir o hábito de jogá-lo ao redor pode ser perigoso. Nesse caso, você possui o script criado para poder fazer o que quiser com as permissões, sem necessidade de sudo.
307 Marie
2
Relacionado de uma maneira geral: Dicas para jogar golfe em Bash
Digital Trauma

Respostas:

18

Você pode deixar de fora todo o touchcomando e não há necessidade de usar sudo. Para reduzir ainda mais a linha de comando, você pode usar a bashExpansão do Histórico para salvar o nome do arquivo pela segunda vez e omitir espaços desnecessários:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

A expansão do histórico substitui !#:3a quarta palavra da linha de comando atual, que no seu caso é o nome do arquivo script.sh. É claro que isso precisa ser adaptado caso você modifique o primeiro comando, por exemplo:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

Observe que um script válido precisa de um shebang :

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

Se você precisar dessa cadeia de comandos com mais frequência, recomendo definir uma função , dessa forma, basta digitar o nome da função. Um modo igualmente adaptável - embora mais longo - é o uso de uma variável que contém o nome do arquivo:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

Se o seu nome de arquivo contiver caracteres especiais, não esqueça de citá-los corretamente .

sobremesa
fonte
20

O installcomando (parte do GNU Coreutils juntamente com cp, mv, rm, etc.) pode copiar um arquivo ao mesmo tempo, definindo sua propriedade e as permissões e criar diretórios pai, se necessário. Por padrão, ele tornará o novo arquivo executável. Ele não entende ' -', mas /dev/stdinpode ser usado:

install /dev/stdin script.sh <<< "echo Hello World"

O exemplo acima usa uma ' string aqui ' para fornecer o texto em stdin, que é um pouco menor do que o canal. Os argumentos para echonão precisar de citação, a menos que contenham caracteres com significado especial.

deltab
fonte
nota que herestring é um Bashismo - um heredoc seria portátil
Steven Penny
3
Boa ideia. Você também pode usar uma substituição de processo :install <(echo echo Hello World) script.sh
Digital Trauma
8

Eu prefiro usar catpara tarefas como esta:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
chave de aço
fonte
1

Você também pode deixar de fora todo o chmod e usar umask antes do eco. Você deve economizar alguns bytes. Shebang é opcional, desde que você use comandos que são entendidos por todos os shell (bourne e C principalmente).

GrumpyGuru
fonte
5
Como você faria isso exatamente?
Wjandrea
Não é possível usar umaskpara definir bit executável por padrão ...
Ravexina