Bagaimana saya bisa menjalankan baris tertentu sebagai perintah dalam file teks?

11

Terkadang saya perlu mengeksekusi satu perintah yang ada dalam skrip shell.

Saya sudah tahu sed -n 'line_num p'bisa mencetak garis itu. Tapi bagaimana saya bisa mengeksekusi yang dicetak baris tertentu sebagai perintah?

Zen
sumber

Jawaban:

9

Coba orang ini =):

sed -n 'line_num p' | bash

atau

"$(sed -n 'line_num p')"
Gilles Quenot
sumber
@ mikeserv Saya tertarik mengetahui konteks pernyataan itu untuk pendidikan saya sendiri.
Bratchley
Tidak perlu menempatkan spasi di antara line_numdan p, jadi misalnya jika line_num123, maka Anda bisa sed -n 123p | bash. Dan jika shsudah cukup, maka gunakan shsaja bash.
janos
Jadi, sed -n 'line_num p' | shbisa jadi solusi lain? Apakah yang ini memiliki lebih banyak kompatibilitas?
Zen
1
@ Zen - itu tergantung pada shell apa yang ditargetkan untuk skrip. Itu juga tergantung pada apa shsebenarnya shell itu. Pada Debian (dan berasal) sistem shbiasanya dash. Jika skrip ditulis untuk dash (atau bergantung pada sintaks portabel) maka mungkin, ya, tetapi jika itu ditulis untuk bashmaka hampir pasti tidak.
mikeserv
dapatkah ini dilakukan dengan file histori sehingga jika saya menjalankan historydan saya melihat bahwa saya ingin menjalankan baris 900, dapatkah saya menjalankan baris 900 entah bagaimana?
codecowboy
3

Jika Anda melakukan ini secara interaktif, Anda bisa menulis baris ke dalam bash history:

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

Kemudian tekan Enteruntuk memasukkan baris ke buffer readline, dan jalankan; yang memberi Anda kesempatan untuk melirik garis sebelum terlambat.

rici
sumber
Itu cukup pintar, dan mungkin asumsi yang bagus.
mikeserv
apa maksud opsi -s ini di sini? Saya tidak dapat menemukan penjelasan diman history
Zen
@zen: historyadalah built-in, sehingga didokumentasikan dalam help history(atau man bash, tapi itu banyak bacaan). Mengutip hal di atas, history -sakan "menambahkan ARG ke daftar riwayat sebagai satu entri"
rici
2

Anda dapat melakukan...

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

Itu hanya akan mendapatkan $NUMbaris dari skrip Anda di variabel shell $linedan kemudian mengevaluasinya sebagai perintah di shell saat ini.

Cara lain untuk melakukan ini bisa terlihat seperti:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"
mikeserv
sumber
1
'eval' adalah salah mengeja yang umum tentang 'jahat'. Jika eval adalah jawabannya, tentunya Anda mengajukan pertanyaan yang salah. Lihat mywiki.wooledge.org/BashFAQ/048
Gilles Quenot
1
Ya. Semua orang suka eval.
mikeserv
gnu sedmemiliki ebendera sehingga sesuatu seperti sed "${NUM}"'!d;s/^//e;q'juga berfungsi
don_crissti
2

Apakah Anda mengedit skrip dengan vim (vi di Linux)? In vi menambahkan pemetaan:

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

dan kemudian ketika Anda berada di jalur yang menarik di vi tekan F4

Walter A
sumber
-2

Dalam bash Anda dapat menjalankan perintah berikut:

for line in $(cat file.txt); do command $line; done
Yan
sumber