Como posso executar uma linha específica como um comando em um arquivo de texto?


11

Às vezes, eu preciso executar um único comando que está em um script de shell.

Eu já sei que sed -n 'line_num p'pode imprimir essa linha. Mas como posso executar uma linha específica impressa como um comando?

Respostas:


9

Tente esse cara =):

sed -n 'line_num p' | bash

ou

"$(sed -n 'line_num p')"

@mikeserv Estou interessado em conhecer o contexto dessa declaração para minha própria educação.
Bratchley

Não há necessidade de colocar um espaço entre line_nume p, por exemplo, se line_numfor 123, você poderá sed -n 123p | bash. E se shfor suficiente, basta usar em shvez de bash.
janos

Então, sed -n 'line_num p' | shpoderia ser outra solução? Este tem mais compatibilidade?
Zen

1
@ Zen - isso depende de qual shell é direcionado para o script. Também depende de qual shell shrealmente é. Nos sistemas Debian (e derivados)sh é geralmente dash. Se o script foi escrito para dash (ou se baseia em sintaxe portátil) , provavelmente, sim, mas se foi escrito para bashisso, quase definitivamente não.
mikeserv

isso pode ser feito com o arquivo de histórico, de modo que, se eu executar historye perceber que desejo executar a linha 900, posso executar a linha 900 de alguma forma?
Codecowboy

3

Se você estiver fazendo isso de maneira interativa, poderá escrever a linha no histórico do bash:

history -s "$(sed -n 'line_num p')"

Em seguida, pressione Enterpara inserir a linha no buffer da linha de leitura e execute-a; isso permite que você olhe para a linha antes que seja tarde demais.


Isso é muito inteligente, e provavelmente uma boa suposição.
precisa saber é o seguinte

o que essa opção -s significa aqui? Não consigo encontrar explicações emman history
Zen

@zen: historyé um built-in, portanto está documentado em help history(ou man bash, mas isso é muita leitura). Citando o acima, history -s"anexará os ARGs à lista de histórico como uma única entrada"
rici 13/01/15

2

Você pode fazer...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

Isso obterá apenas a $NUMlinha do seu script na variável do shell $linee a avaliará como um comando no shell atual.

Outra maneira de fazer isso pode parecer:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
'eval' é um erro de ortografia comum do 'mal'. Se eval é a resposta, certamente você está fazendo a pergunta errada. Veja mywiki.wooledge.org/BashFAQ/048
Gilles Quenot

1
Sim. Todo mundo ama eval.
mikeserv

gnu sedtem a ebandeira de modo algo como sed "${NUM}"'!d;s/^//e;q'também trabalho
don_crissti

2

Você está editando seu script com o vim (vi no Linux)? No vi, adicione um mapeamento:

:nmap <F4> Y:!<C-R>"<C-H><CR>

e depois quando você estiver na linha interessante em vi, pressione F4


-2

No bash, você pode executar o seguinte comando:

for line in $(cat file.txt); do command $line; done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.