Como posso pipilar uma linha de arquivo específica como um comando na linha de comando do linux?

2

Estou tentando executar uma linha específica de arquivo de texto no bash. Eu queria saber se é possível fazer isso sem copiar essa linha em um novo arquivo e executá-lo?

    
por Vladimir Perković 13.07.2012 / 08:53

5 respostas

4

Criando a resposta do @kev (sem direcionar para um novo bash ): Pegue sua fonte de script

script.sh

echo hello
echo world
echo foo
echo bar

e execute uma certa linha dentro de um $(...) :

comando:

$(sed -n '3p' script.sh)

Ele imprimirá foo no bash do seu shell atual.

    
por 13.07.2012 / 11:46
2

script.sh

echo hello
echo world
echo foo
echo bar

comando:

sed -n '3p' script.sh | bash

Ele imprimirá foo

    
por 13.07.2012 / 08:57
1

Se você está falando sobre um shell script, você pode fazer isso como neste exemplo:

#!/bin/bash
LINE='less'
#...
LINE="$LINE myfile.txt"
# now we execute that:
$LINE

Outro exemplo inclui a captura da saída para processamento adicional:

#!/bin/bash
LINE="grep foo bar.txt"
OUTPUT=$($LINE)

No segundo exemplo, a variável $OUTPUT contém os resultados do comando grep executado.

    
por 13.07.2012 / 11:17
1

Provavelmente não é exatamente o que você quer, mas pode ser útil mencionar:

history -r script.sh

Isto lê cada linha do script na sua lista de histórico, a partir da qual você pode executar qualquer linha usando o recurso de expansão de histórico de bash .

Algumas tentativas fracassadas de ler apenas a linha que você deseja executar:

# No command substitution; the argument is added literally
history -s $(sed -n '3p' script.sh)

# Can't seem to read from stdin or from a process substitution
sed -n '3p' script.sh | history -r -
sed -n '3p' script.sh | history -r /dev/stdin
history -r <( sed -n '3p' script.sh )
    
por 13.07.2012 / 14:24
1

Você poderia, mas provavelmente não deveria. Crie uma biblioteca contendo funções e forneça-a. Este é um requisito muito incomum. Bash tem meios reais de controle de fluxo - não há necessidade de pegar seqüências de código dos arquivos para executar. Isso pode ser perigoso.

Aqui está um exemplo de "brinquedo", não para uso em produção ...

#!/usr/bin/env bash

shopt -s extglob

# evalLine filepath line-number
evalLine() {
    [[ -f $1 && $2 == +([[:digit:]]) ]] || return 1
    local x
    # This subtraction compensates for a bug that's since been fixed in 4.2.35 
    mapfile -ts $(($2 - 1)) -n 1 x &&
    ${x:+eval "$x"}
} <"$1"

evalLine /dev/stdin "$1" <<"EOF"
echo "line 1"
f() { echo "$1"; }; f "line 2"
var3='line 3' eval 'echo "$var3"'
EOF

Edição tardia : observe o comentário sobre um bug em mapfile .

    
por 13.07.2012 / 09:27

Tags