มี POSIX (หรืออย่างน้อยเป็นที่นิยม) ยูทิลิตี้เพื่อตั้งไดเรกทอรีการทำงานปัจจุบันเมื่อเรียกใช้โปรแกรมหรือไม่?


20

เรามีenv (1)เพื่อแก้ไขสภาพแวดล้อมของคำสั่งที่เราต้องการเรียกใช้ (ตัวอย่างenv MANPAGER=more man dtrace) มีสิ่งที่คล้ายกัน แต่สำหรับการปรับเปลี่ยนไดเรกทอรีที่คำสั่งจะเริ่มต้นใน

เป็นการดีที่ฉันต้องการให้มีลักษณะเช่นนี้:

theMagicCommand /new/cwd myProgram

วิธีนี้มันอาจจะ "ถูกล่ามโซ่" กับคำสั่ง env (1) เหมือนอื่น ๆ เช่น

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

จนถึงตอนนี้ฉันสามารถคิดถึงวิธีแก้ปัญหาต่อไปนี้ซึ่งน่าเสียดายที่ไม่มีอินเตอร์เฟสเหมือนกับ env (1):

cd /new/cwd && myProgram

นอกจากนี้ฉันสามารถสร้างเชลล์สคริปต์อย่างง่ายเช่นนี้:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

แต่ฉันกำลังมองหาบางอย่างที่มีอยู่แล้ว (อย่างน้อยใน macOS และ FreeBSD)

myProgramไม่จำเป็นต้องเป็นแอปพลิเคชันเดสก์ท็อป (ในกรณีนี้ฉันสามารถใช้ปุ่มPathในไฟล์ . desktop )


6
ทำไมcd /new/cwd && env VAR=value myProgramไม่พบ critera ของคุณ?
jpaugh

ที่มีอยู่แล้วในคำถามที่เอ็ม Piotrowski envอธิบายว่าที่ไม่ได้เป็นอินเตอร์เฟซเดียวกับ envดูที่ เปรียบเทียบกับrtprio, idprio, numactl, jexec, chrtและแน่นอนคำสั่งใน toolsets ที่ระบุไว้ในคำตอบที่ มีรูปแบบและมันคือการโหลดโซ่
JdeBP

3
คุณหมายถึงอะไรโดย“ ส่วนต่อประสาน”? และทำไมไม่ใช้(cd the/cwd; cmd)?
Konrad Rudolph

2
@KonradRudolph ตัวอย่างเช่นคุณไม่สามารถผ่าน(cd the/cwd; cmd)ไปยัง env (1) ได้โดยง่ายโดยไม่ต้องใช้คำสั่ง sh (1)
Mateusz Piotrowski

คำตอบ:


19

AFAIK ไม่มียูทิลิตี้พิเศษดังกล่าวอยู่ในแถบเครื่องมือ POSIX แต่เป็นเรื่องปกติที่จะเรียกใช้shการตั้งค่าสภาพแวดล้อม (cwd, จำกัด , stdout / in / err, umask ... ) ก่อนเรียกใช้คำสั่งเช่นเดียวกับที่คุณทำในshสคริปต์ของคุณ

แต่คุณไม่จำเป็นต้องเขียนสคริปต์นั้นลงในไฟล์คุณสามารถแทรกมันได้:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(สมมติว่าไดเรกทอรีไม่ใช่-) เพิ่มCDPATH=(ในกรณีที่มีหนึ่งในสภาพแวดล้อม) และเพื่อให้การทำงานมากขึ้นเช่นตรง-Pchdir()

อีกวิธีหนึ่งคือคุณสามารถใช้perlซึ่งมีchdir()กล่องตรงchdir()ออกมา

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

โอ้ใช่. นี่คือความหลากหลายของสคริปต์ที่ฉันรวมอยู่ในคำถามของฉัน ฉันกลัวว่ายูทิลิตี้ที่ฉันกำลังมองหาไม่มีอยู่เนื่องจากฟังก์ชั่นการใช้งานมีอยู่แล้วพร้อมกับ sh (1) oneliner ที่ค่อนข้างสั้น
Mateusz Piotrowski

8
หากคุณกำลังทำงานอยู่แล้วคุณยังสามารถทำsh โดยปริยายเปิด subshell เรียกใช้คำสั่งห่อและของหลักสูตรได้รับการกำจัดของกระบวนการเปลือกพิเศษเป็นอย่างที่เริ่มต้นทำงาน (cd /wherever && exec /my/command)()exec/my/command
jpaugh

2
ที่แนะนำในคำตอบที่ถูกลบตอนนี้ ผู้ถามอธิบายว่านั่นไม่ใช่คำตอบของสิ่งที่ xe ถาม
JdeBP

15

ชุดเครื่องมือที่ใช้ในโลก daemontools และที่อื่น ๆ มีสิ่งนี้ให้มากกว่านี้ มีมาหลายปีแล้ว และมีอยู่อย่างกว้างขวาง

ทั้งหมดนี้เป็นเครื่องมือในการโหลดโซ่ออกแบบมาเพื่อใช้ในโซ่ประเภทนี้ มีเครื่องมือโหลดโซ่ให้เลือกมากมายในชุดเครื่องมือเหล่านี้เพื่อวัตถุประสงค์อื่น

อ่านเพิ่มเติม


11

มีโปรแกรมยอดนิยมดังกล่าว มันถูกเรียกว่า ... ถือลงบนเก้าอี้ของคุณ ... รัวกลอง env... รุ่น GNU ตั้งแต่รุ่น 8.28 ไม่ใช่ POSIX มี-Cตัวเลือกที่ให้คุณตั้งค่าไดเรกทอรีได้ตามที่คุณต้องการ:

    ชื่อ
           env - รันโปรแกรมในสภาพแวดล้อมที่ถูกปรับเปลี่ยน

    สรุป
           env [OPTION] ... [-] [NAME = VALUE] ... [คำสั่ง [ARG] ... ]

    รายละเอียด
           ตั้งค่าแต่ละ NAME เป็น VALUE ในสภาพแวดล้อมและเรียกใช้คำสั่ง

           อาร์กิวเมนต์ที่จำเป็นต้องมีสำหรับตัวเลือกแบบยาวนั้นจำเป็นสำหรับตัวเลือกแบบสั้นเช่นกัน

           -i , - ละเลยสภาพแวดล้อม
                  เริ่มต้นด้วยสภาพแวดล้อมที่ว่างเปล่า

           -0 , --null
                  จบแต่ละบรรทัดเอาต์พุตด้วย NUL ไม่ใช่ขึ้นบรรทัดใหม่

           -u , --unset = NAME
                  ลบตัวแปรจากสภาพแวดล้อม

           -C , --chdir = DIR
                   เปลี่ยนไดเรกทอรีทำงานเป็น DIR

           - ช่วยแสดงความช่วยเหลือและออกจากนี้

           --version
                  ข้อมูลเวอร์ชันเอาต์พุตและออก

           เพียง - หมายถึง-i หากไม่มีคำสั่งให้พิมพ์สภาพแวดล้อมที่เป็นผลลัพธ์


เจ๋งแม้ว่ามันจะไม่สามารถใช้งานได้ทันทีใน macOS และ FreeBSD
Mateusz Piotrowski

1

บางโปรแกรมมีตัวเลือกสำหรับสิ่งนี้เช่น Git:

-C <path>

เรียกใช้ราวกับว่าgitเริ่มต้นใน<path>แทนที่จะเป็นไดเรกทอรีการทำงานปัจจุบัน

และทำให้:

-C dir, --directory=dir

เปลี่ยนเป็นไดเร็กทอรีdirก่อนอ่าน makefiles หรือทำสิ่งอื่น

และน้ำมันดิน:

-C, --directory=DIR

เปลี่ยนเป็นDIRก่อนดำเนินการใด ๆ ตัวเลือกนี้มีความอ่อนไหวตามลำดับเช่นมีผลกับตัวเลือกทั้งหมด


ใช่. แม้ว่าคำถามของฉันจะเป็นอย่างไรถ้าmyProgramไม่มีตัวเลือกดังกล่าว ... ขอบคุณสำหรับการสนับสนุนของคุณ แต่ฉันเกรงว่าจะไม่ตอบคำถามของฉันเลย
Mateusz Piotrowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.