Ubuntu: Jalankan output dari perintah lain

13

Saya memiliki baris perintah yang menampilkan baris perintah yang berbeda, misalnya:

> commandlineA param1 param2
  commandlineB param1

Saya ingin memiliki satu eksekusi baris perintah yang akan menjalankan commandlineB dengan parameter yang diberikan.

Apakah ada cara sederhana untuk melakukan itu menggunakan baris perintah tunggal atau apakah saya perlu menjalankan file bash kecil yang akan menyimpan output dalam sebuah variabel dan kemudian menjalankannya?

Terima kasih

Lior Ohana
sumber
2
Mencari cukup lama tapi saya rasa saya harus mengirim pertanyaan untuk menemukan sendiri .... $ (commandlineA param1 param2) melakukan pekerjaan.
Lior Ohana

Jawaban:

17

Anda tampaknya telah menyelesaikannya sendiri, tetapi Anda dapat menggunakan:

$(command parameter1 parameter2)

Edit dari edit: di bawah ini agak salah, sementara itu menjalankan perintah dalam subkulit, ternyata variabel lingkungan masih akan tersedia. Maaf untuk orang yang menyesatkan ...

Sunting: yang akan berjalan dalam subkulit, variabel lingkungan apa pun yang tidak diekspor tidak akan digunakan. Jika Anda ingin menjalankan perintah di shell yang sama, Anda perlu menggunakan:

eval $(command parameter1 parameter2)

Jawaban lain yang diberikan adalah menyalurkan melalui bash itu sendiri:

echo 'uname -a' | bash 

Itu juga akan dieksekusi dalam sebuah subkulit, untuk berjalan dalam shell yang sama Anda akan perlu:

echo 'uname -a' | bash -c

Secara kebetulan, Anda juga dapat menggunakan back ticks alih-alih sintaks $ (), tetapi tidak disarankan .

Chris Sherlock
sumber
(1) Saya tidak tahu persis apa yang Anda maksud dengan "yang akan berjalan dalam subkulit". Variabel lingkungan yang tidak diekspor akan digunakan. (2) Saya tidak melihat alasan untuk menggunakannya di evalsini. Jika Anda punya alasan, mohon jelaskan. (3) Contoh terakhir Anda (dengan  -c) sama sekali salah.
Scott
Anda benar, saya memeriksa lagi dan saya salah di sana. Saat dijalankan sebagai daftar, garpu bash bercabang dan variabel lingkungan masih tersedia. Jadi Anda benar, maaf soal itu.
Chris Sherlock
4

Gunakan ini:

commandlineA param1 param2 | bash

Contoh:

echo "uname -a" | bash

Keluaran:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP Sen 11 Apr 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux
Cyrus
sumber
Tidak ada yang salah dengan ini, namun itu akan melahirkan bash shell lain
Chris Sherlock
Jadi akan$(commandlineA param1 param2)
tripleee
@tripleee: Anda membandingkan jeruk dan labu.  printf '\143\144\040\057\n' | bashakhirnya adalah no-op, karena perintah dijalankan dalam proses shell baru, terpisah (dan sementara). Sebaliknya, $(printf '\143\144\040\057\n')akan menyebabkan shell, aktif, interaktif saat ini mengubah direktori.
Scott