Melewati argumen ke beberapa perintah dalam satu baris


10

Saya ingin dapat menjalankan banyak perintah pada file yang sama dalam satu baris. Cara saya saat ini melakukan ini adalah:

commandA file && commandB file && perl -ne '...' file

Naluri saya memberi tahu saya bahwa harus ada cara untuk memberikan argumen nama file hanya sekali dan menyalurkannya ke kedua perintah secara bersamaan melalui xargsatau sesuatu yang serupa:

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

Ketika saya mencoba ini, hanya perintah pertama yang berjalan. Bagaimana saya bisa mencapai apa yang ingin saya lakukan?

Jawaban:


12

Anda dapat mendefinisikan variabel lokal untuk ini:

f=file; commandA $f && commandB $f && ...

Anda juga dapat menjalankan semua tanpa syarat (mengganti &&dengan ;) atau secara paralel (mengganti &&dengan &).

Atau, Anda juga dapat menggunakan ekspansi riwayat shell untuk referensi argumen sebelumnya:

commandA file && commandB !:1 && ...

Tidak persis apa yang ada dalam pikiran saya, tetapi merupakan alternatif yang menarik.
— Zaid

Apa yang salah dengan jawaban ini?
— Chris

Ini sangat keren! Apakah ada cara untuk tidak mendefinisikan variabel baru?
— pengguna

@ pengguna, saya telah menambahkan alternatif.
— maxschlepzig


2

Anda dapat menggunakan xargs untuk membuat baris perintah, misalnya:

echo file | xargs -i -- echo ls -l {}\; wc -l {}

Hanya pipa di atas ke bash untuk menjalankannya:

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

Memperluas contoh ke semua file * .c di direktori saat ini (keluar dari ls di sini untuk mencegah substitusi alias shell):

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

Digunakan ini untuk mendapatkan daftar semua file yang terkandung dalam direktori di mana namanya seperti "enums": find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
— Matt Lachman

1

Saya tidak akan memilih ini sendiri. Ini konyol dan berbahaya, tetapi hanya untuk mendaftarkan cara untuk melakukan ini, ada:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.