Saya bertanya-tanya apakah mungkin untuk membuat tindakan berantai di terminal Ubuntu seperti:
action 1 on objectA . then action 2 on objectA
tanpa harus mengulangi nama objectA lagi.
Contoh:
touch file.js && openEditor "$1"
atau semacam itu.
command-line
bash
HoCo_
sumber
sumber
&
akan mengirim perintah "sentuh" ke latar belakang. Jika Anda bermaksud "membuka editor jika sentuhan berhasil", maka Anda ingin&&
sebaliknyaJawaban:
Dengan bash History Expansion , Anda dapat merujuk kata ke-n dari baris perintah saat ini menggunakan
!#:n
missumber
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
karakter memperkenalkan ekspresi ekspansi sejarah ketika Anda berada di shell interaktif - itu dimaksudkan untuk manipulasi baris perintah saat Anda mengetik, dan dinonaktifkan di dalam skrip non-interaktifarg1=file.js; touch "$arg1" && openEditor "$arg1"
Ada pintasan praktis untuk kasus penggunaan umum. Dalam contoh Anda, Anda melakukan:
Pada perintah kedua, triknya adalah menulis
openEditor
(dengan spasi setelahnya) diikuti oleh Alt+ .. Ini akan menyisipkan argumen terakhir dari perintah terakhir , yaitufile.js
. (Jika itu tidak berhasil dengan Altalasan tertentu, Escharus bekerja juga.)Karena sering "objek" memang argumen terakhir dari perintah sebelumnya, ini dapat sering digunakan. Mudah diingat dan akan dengan cepat berintegrasi ke dalam set pintas shell yang digunakan secara intuitif.
Ada banyak hal yang dapat Anda lakukan dengan ini, berikut ini adalah artikel mendalam tentang kemungkinan: /programming/4009412/how-to-use-arguments-from-previous-command .
Sebagai bonus, ini tidak hanya bekerja di bash tetapi di semua program yang menggunakan libreadline untuk memproses input baris perintah.
sumber
Alt
dan tekan2.
(atauEsc
,2
,Esc
,.
), untuk mendapatkan kedua argumen terakhir tekanAlt
+-
, jenis2
dan tekanAlt
+.
(atauEsc
,-2
,Esc
,.
).echo 1 2 3 4
maka saya mau2
dan3
untuk perintah selanjutnyaAlt
dan jenis2.
, tekan spacebar, terusAlt
dan jenis3.
- jika Anda ingin suatu range, penggunaan ekspansi sejarah:!!:2-3
.Sejauh shell interaktif default
bash
dan shell skripdash
berjalan, Anda dapat menggunakan$_
untuk mengingat argumen terakhir dari perintah terakhir .csh dan tcsh memiliki referensi sejarah, khusus untuk kata terakhir dari perintah, yang dapat Anda gunakan
!$
, dan untuk argumen individual -!:<index>
:Secara umum, hanya lebih baik untuk menetapkan apa pun
objectA
untuk variabel, dan menggunakannya dalam banyak perintah, loop, dll. Atau, fungsi bisa menjadi pilihan:sumber
$_
bekerja sedikit berbeda dari!#:n
yang terakhir diperluas sebelum menyimpan perintah dalam sejarah. Jadi kembali dalam sejarah masih akan menunjukkan perintah dengan$_
sementara!#:n
akan digantikan dengan nilai aktualnya. Keduanya memiliki pro dan kontra.$_
harus dikutip, karena jika tidak maka akan terbelah dan menggumpal seperti yang lainnya. (Kami hanya tidak melihatnya di sini karenaecho
bergabung dengan argumennya dengan satu spasi.) Tetapi misalnyatouch "hello there"; ls -l $_
tidak akan berhasil.$_
adalah portabel. Bagaimanapun,!#:n
ini spesifik untuk bash.Saya akan merekomendasikan menentang pendekatan sejarah yang diberikan dalam jawaban steeldriver . Ini bergantung pada negara global, yang selalu rapuh.
Lebih baik adalah mem-upfront loop semua perintah yang dibutuhkan, menggunakan variabel yang tepat:
Apa yang agak menjadi masalah secara umum adalah bahwa Bash tidak batal ketika ada kegagalan, yaitu ini sebenarnya berperilaku seperti
touch foo.txt; gedit foo.txt
bukan dengan rantai&&
. Jadi, agar aman Anda dapat menambahkanbreak
:sumber
Saat memasak satu-liner, saya kadang-kadang menetapkan hal yang saya ulangi ke variabel shell yang saya gunakan beberapa kali dalam perintah. Saya dapat mengingat dan mengeditnya untuk menggunakan arg yang berbeda dengan panah atas, kontrol + a, kontrol + panah kanan untuk mendapatkan kursor dekat dengan
t=
.Perhatikan bahwa ini memudahkan untuk menempel pada ekstensi, atau variasi pada nama.
Juga perhatikan bahwa saya memerlukan tugas
;
setelah variabel, karenavar=value cmd
hanya menetapkan itu sebagai variabel lingkungan untuk perintah itu, dan tidak mempengaruhi konteks shell.sumber