Ubuntu: Uruchom dane wyjściowe innego polecenia

13

Mam wiersz poleceń, który wyświetla inny wiersz poleceń, na przykład:

> commandlineA param1 param2
  commandlineB param1

Chciałbym mieć jedno wykonanie wiersza poleceń, które uruchomi wiersz poleceń B z podanymi parametrami.

Czy jest jakiś prosty sposób, aby to zrobić za pomocą jednego wiersza poleceń, czy też muszę uruchomić mały plik bash, który zapisze dane wyjściowe w zmiennej, a następnie uruchom go?

Dzięki

Lior Ohana
źródło
2
Szukałem już od dłuższego czasu, ale chyba musiałem zadać pytanie, by znaleźć to sam ... $ (commandlineA param1 param2) wykonał zadanie.
Lior Ohana,

Odpowiedzi:

17

Wygląda na to, że sam to wypracowałeś, ale możesz użyć:

$(command parameter1 parameter2)

Edycja edycji: poniżej jest nieco źle, chociaż uruchamia polecenie w podpowłoce, okazuje się, że zmienne środowiskowe będą nadal dostępne. Przepraszam za wprowadzających w błąd ludzi ...

Edycja: która będzie działać w podpowłoce, żadne niewyportowane zmienne środowiskowe nie będą używane. Jeśli chcesz uruchomić polecenie w tej samej powłoce, musisz użyć:

eval $(command parameter1 parameter2)

Inną odpowiedzią jest przepuszczenie samego basha:

echo 'uname -a' | bash 

Będzie to również działać w podpowłoce, aby działać w tej samej powłoce, której potrzebujesz:

echo 'uname -a' | bash -c

Nawiasem mówiąc, zamiast składni $ () możesz także użyć tylnych znaczników, ale nie jest to zalecane .

Chris Sherlock
źródło
(1) Nie wiem dokładnie, co masz na myśli przez „to będzie działać w podpowłoce”. Użyte zostaną nieobsługiwane zmienne środowiskowe . (2) Nie widzę tu żadnego powodu, aby z tego korzystać eval. Jeśli masz powód, wyjaśnij to. (3) Twój ostatni przykład (z  -c) jest całkowicie błędny.
Scott
Masz rację, sprawdziłem ponownie i się myliłem. Podczas działania jako lista, powłoka bash rozwidla i zmienne środowiskowe są nadal dostępne. Więc masz rację, przepraszam za to.
Chris Sherlock,
4

Użyj tego:

commandlineA param1 param2 | bash

Przykład:

echo "uname -a" | bash

Wynik:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP Pon 11 kwietnia 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux
Cyrus
źródło
Nie ma w tym nic złego, jednak odrodzi się kolejna powłoka bash.
Chris Sherlock,
Podobnie będzie$(commandlineA param1 param2)
potrójny
@tripleee: Porównujesz pomarańcze i dynie.  printf '\143\144\040\057\n' | bashjest ostatecznie nieobsługiwany, ponieważ polecenie jest wykonywane w nowym, osobnym (i przejściowym) procesie powłoki. Z kolei $(printf '\143\144\040\057\n')spowoduje, że bieżąca, aktywna, interaktywna powłoka zmieni katalog.
Scott