ไม่พบคำสั่ง source ใน sh shell


149

ฉันมีสคริปต์ที่ใช้shเชลล์ ฉันพบข้อผิดพลาดในบรรทัดที่ใช้sourceคำสั่ง ดูเหมือนว่าsourceจะไม่รวมอยู่ในshเปลือกของฉัน

ถ้าฉันพยายามเรียกใช้sourceจาก shell อย่างชัดเจนฉันจะได้รับ:

sh: 1: source: not found

ฉันควรติดตั้ง "แหล่ง" อย่างใดหรือไม่ ฉันมีรุ่นผิดshหรือเปล่า?


1
เราอาจโต้แย้งได้ว่าเชลล์ที่รองรับsourceนั้นเป็น "รุ่นที่ผิด"
William Pursell

1
ข้อความแสดงข้อผิดพลาดsource: not foundหมายความว่าsourceคำสั่งถูกประเมินอย่างเหมาะสม แต่ไฟล์ที่ควรอ่านมีอยู่
Simon Richter

4
ไม่สามารถ "ติดตั้ง" ได้source เนื่องจากเป็นคุณลักษณะของเชลล์ ไม่สามารถใช้เป็นคำสั่งภายนอกได้
Christopher Schultz

คำตอบ:


153

/bin/shมักจะเป็นเปลือกอื่น ๆ ที่พยายามเลียนแบบ The Shell การกระจายจำนวนมากใช้/bin/bashสำหรับshsourceจะสนับสนุน บน Ubuntu แต่ถูกนำมาใช้ซึ่งไม่ได้รับการสนับสนุน/bin/dash sourceเปลือกหอยส่วนใหญ่ใช้แทน. sourceหากคุณไม่สามารถแก้ไขสคริปต์ได้ให้ลองเปลี่ยนเชลล์ที่รันอยู่


2
ขอบคุณ! การเปลี่ยน / bin / sh ด้วย / bin / bash ทำงานบน Ubuntu! ฉันสงสัยว่าทำไมมันถึงมีความหมายกับ Ubuntu bash หรือเปล่า
Milad

1
@Milad: บนล่าสุด Ubuntus, โทร/bin/sh /bin/dashแต่เดิม/bin/shเรียกว่า/bin/bashเป็นโหมดความเข้ากันได้ sh
choroba

@Milad ฉันคิดว่ามันไม่ทำงานบน Ubuntu 14.04 เวอร์ชั่นระบบปฏิบัติการของคุณคืออะไร?
Reza Ameri

1
อาจเป็นที่รู้จักกันดี - หากคุณมีสคริปต์เรียงซ้อนแล้วเปลี่ยนชื่อ "sh -> bash" ทั้งหมด ขอบคุณ. :-)
BG Bruno

ฉันไม่สามารถหยั่งรู้ได้ทันทีว่าจะแก้ไขปัญหานี้ได้อย่างไร แต่น่าเสียดายที่ทำให้ฉันอยู่ในเส้นทางที่ถูกต้อง ฉันต้องเพิ่มSHELL := /bin/bashไปยังด้านบนของ Makefile ของฉัน
anon58192932

136

ในเชลล์เป้าหมาย (sh) ให้ใช้ คำสั่งไปยังแหล่งไฟล์

. filename

ฉันไม่ได้รับอนุญาตให้เปลี่ยนสคริปต์มันทำงานได้ดีบนเซิร์ฟเวอร์ redhat แต่บนเซิร์ฟเวอร์นั้นแหล่งที่มาดูเหมือนจะรวมอยู่ใน sh
Milad

2
ถ้ามันมีมันไม่ได้เป็นอย่างเคร่งครัดsource sh
tripleee

4
ฉันมีปัญหาประเภทนี้กับเจนกินส์ (พยายามที่จะหาไฟล์ที่เก็บเป็น "ไฟล์ลับ") และจัดหาโดย " คำสั่งเป็นทางออก
Jan Vlcinsky

นี่ควรเป็นคำตอบที่ดีที่สุดเพราะจะใช้ได้กับ sh, dash และ bash
akhan

4
เข้ากันได้กับระบบปฏิบัติการ Mac OS (สภาพแวดล้อม dev) และเทรวิส-CI (สภาพแวดล้อมการทดสอบ) . ./filenameผมต้องใช้ มิฉะนั้นฉันจะได้รับsh: 1: .: filename: not foundข้อผิดพลาดเมื่อเรียกใช้การทดสอบกับ Travis-CI
Adrien Joly

49
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

จากนั้นมันก็จะโอเค


ดี! ฉันใช้เซิร์ฟเวอร์ RHEL และ Ubuntu และฉันมักมีปัญหาเล็ก ๆ เช่นนี้กับ Ubuntu ฉันชอบ RHEL และ RHEL เหมือน linux มาก
radtek

คำตอบที่ยอมรับใช้ไม่ได้กับ Ubuntu 14 คำตอบนี้ใช้ได้!
rohithpr

โปรดเพิ่มคำอธิบายเพิ่มเติมลงในคำตอบของคุณ - มันทำอะไรได้บ้าง? dpkg-reconfigureอาจไม่สามารถเข้าถึงได้สำหรับผู้ใช้ทั้งหมดโดยเฉพาะอย่างยิ่งในระบบที่ไม่ได้ใช้ Debian
Nico Haase

แก้ไขsource: not foundข้อผิดพลาดของฉันกับไคลเอนต์ telnet เก่าหลังจากการปรับรุ่นเดเบียนขอบคุณ
bjoster


9

ปัญหานี้เกิดขึ้นเนื่องจาก jenkins Execute Shell เรียกใช้สคริปต์ผ่าน / bin / sh

ดังนั้น / bin / sh จึงไม่รู้จัก "แหล่งที่มา"

คุณเพียงแค่เพิ่มบรรทัดด้านล่างที่ด้านบนสุดของ Execute Shell ในเจนกินส์

#!/bin/bash

คำถามที่ให้นั้นไม่เกี่ยวข้องกับเจนกินส์หลังจากทั้งหมด
นิโก้ฮาเซ่

8

sourceคำสั่งสร้างเป็นเปลือกบาง หากคุณมีสคริปต์ควรระบุว่าเชลล์ใดที่จะใช้ในบรรทัดแรกเช่น:

#!/bin/bash

ดีมันบอกว่า #! / bin / sh และบนลินุกซ์อื่นถ้าฉันป้อน sh ด้วยตนเองและถาม "แหล่งที่มา" มันบอกฉัน: แหล่งที่มา: คำสั่งในตัวเชลล์
Milad

โอ้นี่คือสิ่งที่สายนี้มีไว้สำหรับ ฉันสงสัยอยู่เสมอ ขอบคุณมาก!
CommonSenseCode

5

ฉันประสบข้อผิดพลาดนี้ขณะที่ฉันพยายามโทรหาแหล่งที่มาคำสั่งจาก #Jenkins รันเชลล์

source profile.txt หรือ source profile.properties

ทดแทนแหล่งที่มาคำสั่งคือการใช้

. ./profile.txt หรือ . ./profile.properties

หมายเหตุ:มีช่องว่างระหว่างสองจุด (.)


0

ฉันพบใน gnu Makefile บน Ubuntu, (ที่ไหน / bin / sh -> bash)

ฉันต้องการใช้ คำสั่งรวมทั้งระบุสคริปต์เป้าหมายด้วย. / คำนำหน้า (ดูตัวอย่างด้านล่าง)

แหล่งที่มาไม่ทำงานในอินสแตนซ์นี้ไม่แน่ใจว่าทำไมเพราะมันควรจะเรียก / bin / bash ..

ตัวแปรสภาพแวดล้อม SHELL ของฉันยังถูกตั้งค่าเป็น / bin / bash

test:
    $(shell . ./my_script)

หมายเหตุตัวอย่างนี้ไม่มีอักขระแท็บ ต้องจัดรูปแบบสำหรับการแลกเปลี่ยนสแต็ก


0

sourceเป็นคำสั่งในตัวของ bash ดังนั้นในการรันคำสั่ง source คุณสามารถเข้าสู่ระบบได้ในฐานะรูท

sudo -s source ./filename.sh


ดูเหมือนว่าวิธีการแก้ไขจะไม่ถูกต้อง ถ้าผู้ใช้ไม่มีสิทธิ์ sudo ล่ะ และสิ่งที่มานั้นจะพร้อมใช้งานในฐานะผู้ใช้ของผู้ดูแลระบบเท่านั้นซึ่งจะทำให้เกิดปัญหาใหม่
Nico Haase

0

บน Ubuntu แทนที่จะใช้ sh scriptname.sh เพื่อเรียกใช้ไฟล์ฉันใช้ไปแล้ว scriptname.sh และใช้งานได้! บรรทัดแรกของไฟล์ของฉันมี: #!/bin/bash

ใช้คำสั่งนี้เพื่อเรียกใช้สคริปต์

.name_of_script.sh

1
สิ่งนี้ได้รับคำตอบแล้วหลายครั้ง โปรดให้ข้อมูลเพิ่มเติมหากคุณเพิ่มคำตอบใหม่ในกรณีเช่นนี้
Nico Haase

-3

สิ่งนี้อาจช่วยคุณได้ฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันพยายามโหลด.profileคำสั่งของฉันใหม่. .profileและมีข้อผิดพลาดทางไวยากรณ์


-6

บอร์นเชลล์ (SH) source <file>ใช้เส้นทางไปตั้งอยู่ที่ หากไฟล์ที่คุณพยายามแหล่งที่มาไม่ได้อยู่ในเส้นทางของคุณคุณจะได้รับข้อผิดพลาด 'ไม่พบไฟล์'

ลอง:

source ./<filename>

5
โพสต์บอกsh: 1: source: not foundว่าไม่ได้file not found
Cristian Chaparro A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.