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.