cria arquivos executáveis via tubulação

2

Usando pipes, pode-se criar arquivos com simples built-ins de shell.

{ echo "#!/bin/bash" \
  echo "echo Hello, World!" \
} > helloworld.sh

Com chmod , estes podem ser executados.

$ chmod 755 helloworld.sh
$ ./helloworld.sh
Hello, World!

Gostaria de saber se é possível salvar a etapa chmod . Já descobri que umask não pode realizar o trabalho . Mas talvez alguém conheça uma variável de ambiente, truque bash, programa para canalizar ou outra maneira simples de fazê-lo.

É possível ter o arquivo criado com o bit executável já definido?

    
por XZS 14.03.2017 / 21:11

2 respostas

3

Não é possível criar um arquivo executável somente com um operador de redirecionamento de shell. Não há maneira portátil, e também não há maneira de bash (no código-fonte, você pode ver que o redirecionamento chama do_redirection_internal que chamadas redir_open com o parâmetro mode definido para 0666, e este, por sua vez, chama open com este modo).

Você está chamando um comando shell, então adicione ; chmod +x … em algum lugar. Não há absolutamente nada de errado com isso. Mais uma linha de código não é um problema. Você precisa fazer três coisas (criar um arquivo com algum conteúdo, tornar o arquivo executável, executá-lo), então escreva três linhas.

Existe um comando shell relativamente obscuro que pode criar um arquivo executável com algum conteúdo especificado: uudecode . Mas eu não recomendaria usá-lo: ele requer que a entrada seja passada em um formato não legível, ela ignora a umask do usuário e é obscura.

Uma alternativa sã é chamar bash /the/script em vez de chmod +x /the/script && chmod +x , se você souber com que interpretador executar o arquivo.

    
por 15.03.2017 / 01:11
2

Uma função para criar um script de shell executável a partir da entrada canalizada:

pipe2script() { touch "$1" ; chmod +x "$1" ; \
                echo '#!'"$(which ${2:-bash})"  > "$1" ; cat >> "$1" ; }

Use pipe2script para canalizar duas linhas de texto para foo.sh :

printf 'echo hello world\necho bye\n' | pipe2script foo.sh

Isso gera um novo arquivo executável, foo.sh :

$ ls -log foo.sh 
-rwxrwxr-x 1 38 Mar 18 09:05 foo.sh

A execução de cat foo.sh mostra:

#!/bin/bash
echo hello world
echo bye

Execute:

./foo.sh

Saída:

hello world
bye

A função pipe2script usa como padrão bash , mas pode receber um segundo argumento de qualquer outro nome de shell, por exemplo, dash , zsh , ksh93 , python , etc. fish comando math do shell:

printf 'math "99^33"\n' | pipe2script foo.fish fish

A execução de cat foo.fish mostra:

#!/usr/bin/fish
math "99^33"

Saída de ./foo.fish :

717730532598275105894510914059816191752829524684539601273450723299

Edite uma cópia de um script:

sed '2,${s/.*/echo & | jethro/e;s/ / "/;s/$/"/}' foo.sh | pipe2script foojc.sh

Saída quando executado:

$ ./foojc.sh 
howdy world
y'all come back now, heah?
    
por 17.03.2017 / 15:46