lệnh nguồn không tìm thấy trong sh shell


146

Tôi có một kịch bản sử dụng shshell. Tôi nhận được một lỗi trong dòng sử dụng sourcelệnh. Có vẻ như sourcekhông được bao gồm trong shvỏ của tôi .

Nếu tôi rõ ràng cố gắng chạy sourcetừ shell, tôi nhận được:

sh: 1: source: not found

Tôi có nên cài đặt "nguồn" nào đó không? Tôi có một phiên bản sai của sh?


1
Người ta có thể lập luận một cách hợp lý rằng một cái vỏ hỗ trợ sourcelà "phiên bản sai".
William Pursell

1
Ngoài ra, thông báo lỗi source: not foundcó nghĩa là sourcelệnh đã được đánh giá đúng, nhưng tệp mà nó nên đọc không tồn tại.
Simon Richter

4
Không thể "cài đặt" source đây là một tính năng của vỏ. Nó không thể được thực hiện như một lệnh bên ngoài.
Christopher Schultz

Câu trả lời:


150

/bin/shthường là một số vỏ khác cố gắng bắt chước The Shell. Nhiều bản phân phối sử dụng /bin/bashcho sh, nó hỗ trợ source. Trên Ubuntu, tuy nhiên, /bin/dashđược sử dụng mà không hỗ trợ source. Hầu hết các vỏ sử dụng .thay vì source. Nếu bạn không thể chỉnh sửa tập lệnh, hãy thử thay đổi trình bao chạy nó.


2
Cảm ơn! Thay thế / bin / sh bằng / bin / bash đã hoạt động trên Ubuntu! Tôi tò mò tại sao mặc dù, điều đó có nghĩa là trên Ubuntu bash là sh?
Milad

1
@Milad: Trên Ubuntus gần đây, /bin/shcác cuộc gọi /bin/dash. Theo truyền thống, /bin/shđược gọi /bin/bashlà chế độ tương thích sh.
choroba

@Milad Tôi nghĩ rằng nó không hoạt động trên Ubuntu 14.04. Phiên bản hệ điều hành của bạn là gì?
Reza Ameri

1
Có thể giúp đỡ được biết - nếu bạn có tập lệnh xếp tầng thì đổi tên tất cả "sh -> bash". Cảm ơn bạn. :-)
BG Bruno

Thật không may ngay lập tức cho tôi cách khắc phục vấn đề này một cách đáng tiếc nhưng nó đã đưa tôi đi đúng hướng. Tôi đã phải thêm SHELL := /bin/bashvào đầu Makefile của tôi.
anon58192932

136

Trong vỏ Bourne (sh), sử dụng. lệnh để nguồn một tập tin

. filename

Tôi không thực sự được phép thay đổi tập lệnh, nó chạy tốt trên máy chủ redhat. Nhưng trên máy chủ đó, nguồn dường như được đưa vào sh
Milad

2
Nếu nó có sourcenó không nghiêm ngặt sh.
tripleee

4
Tôi đã gặp loại sự cố này trên Jenkins (cố gắng tìm nguồn tệp được lưu trữ dưới dạng "tệp bí mật") và tìm nguồn cung ứng bằng "." lệnh là giải pháp.
Jan Vlcinsky

Đây phải là câu trả lời hàng đầu vì nó sẽ hoạt động với sh, dash và bash.
akhan

3
Để tương thích với Mac OS (môi trường dev) và Travis-CI (môi trường thử nghiệm), tôi đã phải sử dụng . ./filename. Nếu không, tôi sẽ gặp sh: 1: .: filename: not foundlỗi khi chạy thử nghiệm trên Travis-CI.
Adrien Joly

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

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

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

Sau đó sẽ ổn thôi


Đẹp! Tôi đang chạy các máy chủ của RHEL và Ubuntu và tôi luôn gặp các sự cố nhỏ như sự cố này với Ubuntu. Tôi thực sự thích RHEL và RHEL như linux.
radtek

Câu trả lời được chấp nhận không hoạt động trên Ubuntu 14, câu trả lời này không!
rohithpr

Vui lòng thêm một số giải thích thêm cho câu trả lời của bạn - nó làm gì? dpkg-reconfigurecó thể không truy cập được đối với tất cả người dùng, đặc biệt là trên các hệ thống không dựa trên Debian
Nico Haase

Đã source: not foundsửa lỗi của tôi với các máy khách telnet cũ sau khi nâng cấp debian, cảm ơn.
bjoster


9

Vấn đề này xảy ra vì jenkins Execute Shell chạy tập lệnh thông qua / bin / sh của nó

Do đó, / bin / sh không biết "nguồn"

Bạn chỉ cần thêm dòng dưới đây vào đầu Execute Shell của bạn trong jenkins

#!/bin/bash

Rốt cuộc, câu hỏi được đưa ra không liên quan đến Jenkins
Nico Haase

8

Các sourcelệnh được xây dựng vào một số vỏ. Nếu bạn có một tập lệnh, nó sẽ chỉ định shell nào sẽ được sử dụng trên dòng đầu tiên, chẳng hạn như:

#!/bin/bash

Chà, nó nói #! / Bin / sh và trên một linux khác nếu tôi nhập thủ công sh và hỏi "nguồn nào" nó cho tôi biết: source: shell tích hợp lệnh
Milad

oh, đây là những gì dòng này là dành cho. Tôi luôn thắc mắc. lời cảm ơn to lớn!
CommonSenseCode

5

Tôi đã gặp phải lỗi này trong khi tôi đang cố gắng gọi lệnh nguồn từ #Jenkins thực thi shell.

source profile.txt hoặc là source profile.properties

Thay thế cho lệnh nguồn là sử dụng,

. ./profile.txt hoặc là . ./profile.properties

Lưu ý: Có một khoảng trắng giữa hai dấu chấm (.)


0

Tôi đã tìm thấy trong một Makefile gnu trên Ubuntu, (trong đó / bin / sh -> bash)

Tôi cần phải sử dụng. lệnh, cũng như chỉ định tập lệnh đích có tiền tố ./ (xem ví dụ bên dưới)

nguồn này không hoạt động trong trường hợp này, không biết tại sao vì nó nên gọi / bin / bash ..

Biến môi trường SHELL của tôi cũng được đặt thành / bin / bash

test:
    $(shell . ./my_script)

Lưu ý mẫu này không bao gồm ký tự tab; phải định dạng để trao đổi ngăn xếp.


0

source là một lệnh bash tích hợp sẵn để thực thi lệnh nguồn, bạn có thể đăng nhập với quyền Root.

sudo -s source ./filename.sh


Đây không giống như một giải pháp hợp lệ. Nếu người dùng không có quyền sudo thì sao? Và những thứ có nguồn gốc sau đó chỉ có sẵn với tư cách là người dùng quản trị viên, điều này sẽ gây ra rắc rối mới
Nico Haase

0

Trên Ubuntu, thay vì sử dụng sh scriptname.sh để chạy tệp, tôi đã sử dụng. scriptname.sh và nó đã làm việc! Dòng đầu tiên của tệp của tôi chứa: #!/bin/bash

sử dụng lệnh này để chạy tập lệnh

.name_of_script.sh

1
Điều này đã được trả lời nhiều lần. Vui lòng cung cấp thêm thông tin nếu bạn thêm câu trả lời mới trong trường hợp như vậy
Nico Haase

-3

Điều này có thể giúp bạn, tôi đã gặp lỗi này vì tôi đang cố tải lại .profilelệnh của mình . .profilevà nó bị lỗi cú pháp


-6

Vỏ Bourne (sh) sử dụng PATH để xác định vị trí source <file>. Nếu tệp bạn đang cố gắng tìm nguồn không nằm trong đường dẫn của bạn, bạn sẽ gặp lỗi 'không tìm thấy tệp'.

Thử:

source ./<filename>

5
Bài đăng nói sh: 1: source: not foundkhôngfile not found
Cristian Chaparro A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.