การเรียกใช้สคริปต์จากไดเรกทอรีอื่น


11

บ่อยครั้งที่สคริปต์ที่ฉันต้องการดำเนินการไม่ได้อยู่ในไดเรกทอรีการทำงานปัจจุบันของฉันและฉันไม่ต้องการออกจากมัน

เป็นการดีที่จะเรียกใช้สคริปต์ (BASH, Perl และอื่น ๆ ) จากไดเรกทอรีอื่นหรือไม่? พวกเขามักจะพบสิ่งของทุกอย่างที่พวกเขาต้องการเพื่อให้ทำงานอย่างถูกต้องหรือไม่?

ถ้าอย่างนั้นวิธีที่ดีที่สุดในการใช้งานสคริปต์ "ไกล" คืออะไร? ใช่ไหม

. /path/to/script

หรือ

sh /path/to/script

และวิธีการใช้งานsudoในกรณีเช่นนี้? เช่นนี้ไม่ทำงาน:

sudo . /path/to/script

ระวัง. /path/to/script แหล่งที่มาของสคริปต์! คุณไม่จำเป็นต้องใช้ช่วงเวลาเลยหากคุณต้องการเรียกใช้
gniourf_gniourf

คำตอบ:


14

sh / path / to / script จะวางไข่เชลล์ใหม่และรันสคริปต์ของเธอโดยไม่ขึ้นกับเชลล์ปัจจุบันของคุณ source(.) คำสั่งจะเรียกคำสั่งทั้งหมดในสคริปต์ในเปลือกปัจจุบัน หากสคริปต์เกิดขึ้นที่จะเรียกexitเช่นนั้นคุณจะสูญเสียเปลือกปัจจุบัน ด้วยเหตุนี้จึงปลอดภัยกว่าที่จะเรียกใช้สคริปต์ในเชลล์แยกต่างหากด้วย sh หรือเรียกใช้งานเป็นไบนารีโดยใช้ทั้งเต็ม (เริ่มต้นด้วย /) หรือพา ธ สัมพัทธ์ (./) หากเรียกว่าเป็นไบนารีระบบจะดำเนินการกับล่ามที่ระบุ (ตัวอย่างเช่น #! / bin / bash)

สำหรับการรู้ว่าสคริปต์จะค้นหาไฟล์ที่ต้องการหรือไม่ไม่มีคำตอบที่ดีนอกจากดูที่สคริปต์เพื่อดูว่ามันทำอะไร เป็นตัวเลือกคุณสามารถไปที่โฟลเดอร์ของสคริปต์ในกระบวนการย่อยโดยไม่ต้องออกจากโฟลเดอร์ปัจจุบันของคุณ:

$(cd /wherever/ ; sh script.sh)

3
คุณหมายถึง(cd /wherever/ ; sh script.sh)อะไร ทำไมคุณถึงมี$หน้า?
G-Man กล่าวว่า 'Reinstate Monica'

7

คุณสามารถทำได้อย่างแน่นอน (ด้วยการปรับค่าอื่น ๆ ที่กล่าวถึงเช่นsudo sh /pathto/script.shหรือ./script.sh) อย่างไรก็ตามฉันทำหนึ่งในสองสามสิ่งเพื่อเรียกใช้ระบบโดยไม่ต้องกังวลเกี่ยวกับ dirs และช่วยฉันพิมพ์พิเศษที่ไร้ประโยชน์

1) Symlink ไปที่ /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

(ตรวจสอบให้แน่ใจว่าไม่มีชื่อที่ทับซ้อนกันเพราะคุณจะเห็นได้ชัดว่าแทนที่) นอกจากนี้ยังช่วยให้ฉันเก็บไว้ในโฟลเดอร์การพัฒนาของฉันเพื่อให้ฉันสามารถปรับได้ตามความจำเป็น

2) เพิ่ม Scripts dir ให้กับเส้นทางของคุณ (โดยใช้. bash_profile - หรืออะไรก็ตามที่โปรไฟล์ของคุณมีอยู่ในเชลล์)

PATH=/path/to/scripts/:$PATH

3) สร้างนามแฝงใน.bash_profile ใน~/.bash_profileบางสิ่งบางอย่างเพิ่มเช่น:

alias l="ls -l"

อย่างที่คุณสามารถบอกได้ว่าไวยากรณ์เป็นเพียงนามแฝงหลักที่คุณต้องการทำหน้าที่เป็นคำสั่งคือคำสั่ง ดังนั้นการพิมพ์ "l" ที่ใดก็ได้ในเทอร์มินัลจะส่งผลให้ls -l ถ้าคุณต้องการ sudo เพียงalias sl="sudo ls -l"ให้สังเกตตัวเอง l vs sl (เป็นตัวอย่างที่ไร้ประโยชน์)

ไม่ว่าจะด้วยวิธีใดคุณสามารถพิมพ์sudo nameofscriptและไปในทางของคุณ ไม่จำเป็นต้องยุ่งกับ. / หรือ หรือ sh เป็นต้นเพียงทำเครื่องหมายเป็น executable first: D


ฉันจะขอแนะนำตัวเลือกที่ 2
แบร์นฮาร์ด

ทำไมจึงเป็นแนวปฏิบัติที่ดีที่สุดหรือแค่ลิ้มรส?
เซร์คิโอ

3

ฉันมักจะทำเหมือนที่คุณพูด

sh /path/to/script

และเรียกใช้เป็น root / superuser

sudo sh /path/to/script

ไดเรกทอรีปัจจุบันของคุณสำคัญหากสคริปต์ถือว่าคุณอยู่ในโฟลเดอร์เดียวกับมัน ฉันจะสมมติว่าสคริปส่วนใหญ่จะไม่ทำเช่นนี้และคุณได้รับการบันทึกเพื่อให้ทำงานได้เหมือนด้านบน


จะไม่ทำงานถ้า secure_path ตั้งอยู่ในไฟล์ / etc / sudoers
l1zard

3

ฉันมักจะเก็บสคริปต์ของฉันไว้ใน/usr/local/binหรือ/usr/local/sbin/(ถ้าสคริปต์ต้องการสิทธิ์รูท) โดยอ้างอิงจาก Filesystem Hierarchy Standard (FHS) พวกเขาอยู่

PATHสิ่งที่คุณต้องทำคือการทำให้แน่ใจว่าทั้งสองไดเรกทอรีจะมีการเพิ่มของคุณ คุณสามารถทำได้โดยแก้ไข$HOME/.bashrcไฟล์และเพิ่มบรรทัดนี้:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

หากคุณต้องการที่จะสามารถที่จะดำเนินการสคริปต์เป็นรากผ่านsudoคุณต้องเพิ่มไดเรกทอรีเหล่านี้ให้กับตัวแปรในของคุณsecure_path/etc/sudoers

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

การแก้ไขไฟล์นี้ทำได้โดยการเรียกใช้visudoซึ่งทำให้คุณมั่นใจได้ว่าจะไม่มีข้อผิดพลาดใด ๆ


สะกดผิด: คุณหมายถึงแทน.bashrc .bachrc
gniourf_gniourf

0

ฉันไม่แน่ใจว่ามันใช้งานได้ใน linux หรือไม่หากไม่มีใครแนะนำ แต่แทนที่จะใช้. /./ เพื่อย้อนกลับไดเรกทอรี คุณสามารถใช้เครื่องหมายคำพูดเพื่อกำหนดเส้นทางที่แน่นอนได้หรือไม่? บางทีมันอาจไม่ให้คุณเข้าถึงไดรฟ์ทั้งหมดเพื่อให้สามารถทำสิ่งนั้นได้


0

หากคุณมีสคริปต์วางอยู่รอบ ๆ ที่คุณต้องการเรียกใช้งานบ่อยครั้งและสคริปต์เหล่านั้นขึ้นอยู่กับที่ตั้งของพวกเขาเพื่อค้นหาแหล่งข้อมูลที่คุณสามารถทำได้โดยการรวมคำสั่งในนามแฝงเช่นนี้

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

วิธีนี้คุณไม่จำเป็นต้องแก้ไขสิ่งอื่นเพื่อให้ทำงานได้


0

ไม่แน่ใจว่าทำไมไม่มีใครแนะนำสิ่งนี้ แต่มันง่ายมาก! ฉัน Googled สองสามครั้งและไม่สามารถหาคำตอบที่แน่นอนนี้ฉันให้ดังนั้นฉันคิดว่าฉันจะแบ่งปัน IMO นี่เป็นทางออกที่ดีที่สุดสำหรับฉันด้วยอย่างไรก็ตามผู้อื่นอาจรู้สึกและทำสิ่งที่แตกต่าง

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

ก่อนอื่นคำสั่ง 'cd' จะบอกไดเรกทอรีของตำแหน่งสคริปต์ จากนั้น '&&' เพื่อให้คุณสามารถผูกมันหลังจาก excuting คำสั่งต่อไป ในที่สุดก็เปิดสคริปต์ของคุณเช่นเดียวกับที่คุณจะรันมันใน terminal! บันทึกไฟล์ BASH ของคุณและใช้เวลาในการติดตั้ง 5 วินาที

หวังว่านี่จะช่วยใครซักคน


-1

คำถามโบราณ แต่เป็นอมตะ

วิธีแก้ปัญหาที่ฉันเคยเห็นอย่างต่อเนื่องคือการมี$HOME/binไดเรกทอรีและใส่มันเป็นครั้งแรก$PATH(ผ่าน~/.bashrcถ้ามันไม่ได้มีในบางระบบ~/binเป็นครั้งแรก$PATHโดยค่าเริ่มต้น) การวางสคริปต์ในที่นั่นเพื่อเรียกใช้งานหรือเชื่อมโยงไปยังสคริปต์ / ไฟล์เรียกใช้งานที่อื่นเป็นวิธีที่ง่ายในการจัดการกับปัญหาของพา ธ ที่ไม่ควรส่งผลกระทบต่อระบบหรือผู้ใช้รายอื่น

หากสคริปต์ต้องการทรัพยากรเพิ่มเติมที่สามารถพบได้เมื่อเทียบกับตำแหน่งของตัวเอง (ไม่ใช่เรื่องผิดปกติ) ระบบ$BASH_SOURCEจะใช้envvar มักจะมีเส้นทางสัมบูรณ์ไปยังสคริปต์ทำงานในขณะนี้ตัวเองโดยไม่คำนึงถึงความคุ้มค่าของ$BASH_SOURCE$PWD

พิจารณาสิ่งต่อไปนี้:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

ดังนั้นเราจะเห็นได้ว่า$HOME/binมันเป็นครั้งแรก$PATHดังนั้นสิ่งที่ฉันใส่~/binจะวิ่ง ฉันมีสคริปต์สาธิตชื่อ~/bin/findme:

#!/bin/bash

echo "Running from $BASH_SOURCE"

สิ่งนี้สามารถใช้ในการรับเส้นทางที่แน่นอนไปยังตำแหน่งของสคริปต์ที่ทำงานอยู่

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

(1) แม้ว่าสิ่งนี้จะเป็นข้อมูลที่มีประโยชน์ แต่คำถามก็ไม่ได้ถามถึงวิธีการเขียนสคริปต์ที่ใช้ทรัพยากรที่เกี่ยวข้องกับตำแหน่งของตนเอง มันถามเกี่ยวกับการเรียกใช้สคริปต์ (2) ฉันไม่แน่ใจว่าย่อหน้าที่สองของคุณตอบคำถามอย่างไร คุณแนะนำว่าถ้าฉันเขียนสคริปต์และ Desmond ต้องการเรียกใช้มันเขาควรเชื่อมโยงมันเข้ากับbinไดเรกทอรีส่วนตัวของเขา? ดูเหมือนว่าจะยุ่งยาก (3) นอกจากนี้ยังทำลายความเป็นอิสระของที่ตั้ง หาก/home/desmond/bin/fooเป็นลิงก์ไปยังสคริปต์ของฉันBASH_SOURCEจะเป็น/home/desmond/bin/fooเช่นนั้นและสคริปต์จะไม่สามารถค้นหาทรัพยากรได้
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man (1) ผู้ใช้ไม่ได้ให้บริบทมากนัก เมื่อใดก็ตามที่คำถามนี้ถูกถามฉันในช่วง 30 ปีที่ผ่านมามันมักจะอยู่ในบริบทที่ผู้ใช้ (มักจะเป็น sysop หรือนักพัฒนาใหม่) ที่ใช้งานสคริปต์ของตัวเองและสคริปต์ที่ได้มาอื่น ๆ ทาง นี้ไม่ถือว่าเกร็ดความรู้การเขียนสคริปต์ในส่วนของการขอให้ผู้ใช้ (2) คริปทั้งระบบมักจะติดตั้งในหรือสถานที่ที่รู้จักกันดีใน/bin /opt(3) ความเป็นอิสระของที่ตั้งเป็นสิ่งที่รักษาไว้เมื่อเขียนคอลเล็กชั่นสคริปต์ส่วนตัว
zxq9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.