Ubuntu: เรียกใช้เอาต์พุตของคำสั่งอื่น


13

ฉันมีบรรทัดคำสั่งที่ส่งออกบรรทัดคำสั่งอื่นตัวอย่างเช่น:

> commandlineA param1 param2
  commandlineB param1

ฉันต้องการให้มีการดำเนินการบรรทัดคำสั่งเดียวที่จะรัน commandlineB พร้อมพารามิเตอร์ที่กำหนด

มีวิธีง่ายๆในการทำเช่นนั้นโดยใช้บรรทัดคำสั่งเดียวหรือฉันจำเป็นต้องเรียกใช้ไฟล์ bash ขนาดเล็กที่จะเก็บผลลัพธ์ในตัวแปรแล้วเรียกใช้หรือไม่

ขอบคุณ


2
ค้นหามาระยะหนึ่งแล้ว แต่ฉันคิดว่าฉันต้องโพสต์คำถามเพื่อค้นหาด้วยตัวเอง .... $ (commandlineA param1 param2) ทำงานได้
Lior Ohana

คำตอบ:


17

คุณดูเหมือนจะทำสิ่งนี้ด้วยตัวคุณเอง แต่คุณสามารถใช้:

$(command parameter1 parameter2)

แก้ไขการแก้ไข:ด้านล่างค่อนข้างผิดในขณะที่มันรันคำสั่งใน subshell ปรากฎว่าตัวแปรสภาพแวดล้อมจะยังคงมีอยู่ ขออภัยที่ทำให้ผู้อื่นเข้าใจผิด ...

แก้ไข:ที่จะทำงานใน subshell ตัวแปรสภาพแวดล้อมที่ไม่ได้ส่งออกใด ๆ จะไม่ถูกนำมาใช้ หากคุณต้องการรันคำสั่งในเชลล์เดียวกันคุณต้องใช้:

eval $(command parameter1 parameter2)

อีกคำตอบที่ได้รับคือไปป์ผ่าน bash เอง:

echo 'uname -a' | bash 

ที่จะดำเนินการใน subshell เพื่อให้ทำงานในเชลล์เดียวกันคุณจะต้อง:

echo 'uname -a' | bash -c

อนึ่งคุณยังสามารถใช้กลับเห็บแทน $ () ไวยากรณ์ แต่ก็ไม่แนะนำให้ใช้


(1) ฉันไม่รู้ว่าคุณหมายถึงอะไรโดย“ จะทำงานใน subshell” ตัวแปรสภาพแวดล้อมที่ไม่ได้ส่งออกจะถูกนำมาใช้ (2) ฉันไม่เห็นเหตุผลที่จะใช้evalที่นี่ หากคุณมีเหตุผลโปรดอธิบาย (3) ตัวอย่างสุดท้ายของคุณ (พร้อม  -c) ผิดทั้งหมด
สกอตต์

คุณถูกต้องฉันตรวจสอบอีกครั้งและฉันทำผิดที่นั่น เมื่อรันเป็นรายการ bash shell จะส้อมและตัวแปรสภาพแวดล้อมยังคงพร้อมใช้งาน ดังนั้นคุณถูกต้องขอโทษด้วย
Chris Sherlock

4

ใช้สิ่งนี้:

commandlineA param1 param2 | bash

ตัวอย่าง:

echo "uname -a" | bash

เอาท์พุท:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP จันทร์ 11 เม.ย. 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux

ไม่มีอะไรผิดปกติกับเรื่องนี้ แต่มันจะวางไข่เปลือกหอยอีกครั้ง
Chris Sherlock

ดังนั้นจะ$(commandlineA param1 param2)
tripleee

@tripleee: คุณกำลังเปรียบเทียบส้มกับฟักทอง  printf '\143\144\040\057\n' | bashในที่สุดก็เป็น no-op เนื่องจากคำสั่งได้รับการดำเนินการในกระบวนการเชลล์ใหม่ (และชั่วคราว) ในทางตรงกันข้าม$(printf '\143\144\040\057\n')จะทำให้เปลือกโต้ตอบปัจจุบันที่ใช้งานอยู่เปลี่ยนไดเรกทอรี
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.