Команда джерела не знайдена в оболонці sh


146

У мене є сценарій, який використовує shоболонку. Я отримую помилку в рядку, який використовує sourceкоманду. Здається source, не входить до моєї shоболонки.

Якщо я явно спробую запустити sourceз оболонки, я отримаю:

sh: 1: source: not found

Чи варто якось встановити "джерело"? У мене неправильна версія sh?


1
Можна справедливо стверджувати, що оболонка, яка підтримує, sourceє "неправильною версією".
Вільям Перселл

1
Також повідомлення про помилку source: not foundозначає, що sourceкоманда була оцінена належним чином, але файл, який він повинен був прочитати, не існує.
Саймон Ріхтер

4
Неможливо «встановити», source оскільки це особливість оболонки. Вона не може бути реалізована як зовнішня команда.
Крістофер Шульц

Відповіді:


151

/bin/shзазвичай це якась інша оболонка, яка намагається імітувати Оболонку. Багато дистрибутивів використовують /bin/bashдля цього sh, він підтримує source. На Ubuntu, однак, /bin/dashвикористовується який не підтримує source. Більшість оболонок використовують .замість source. Якщо ви не можете відредагувати сценарій, спробуйте змінити оболонку, яка його запускає.


2
Дякую! Заміна / bin / sh на / bin / bash справді працювала на Ubuntu! Мені цікаво, чому, однак, це означає на Ubuntu bash sh?
Мілад

1
@Milad: нещодавні Ubuntus, /bin/shдзвінки /bin/dash. Традиційно /bin/shназивається /bin/bashрежим sh-сумісності.
choroba

@Milad Я думаю, що це не працює на ubuntu 14.04. Яка версія вашої ОС?
Reza Ameri

1
Можливо, допоможе відома - якщо у вас є каскадні сценарії, то перейменуйте всі "sh -> bash". Дякую. :-)
БГ Бруно

Мені не відразу зрозуміло, як виправити цю проблему, на жаль, але це поставило мене на правильний шлях. Мені довелося додати SHELL := /bin/bashдо початку мого Makefile.
anon58192932

136

У оболонці Bourne (sh) використовуйте. команда для джерела файлу

. filename

Мені не дозволено змінювати сценарій, він працює добре на сервері redhat. Але на цьому сервері джерело, здається, включено в sh
Мілад

2
Якщо вона є, sourceце не суворо sh.
трійчатка

4
У мене був такий тип проблем у Дженкінса (намагався створити файл, який зберігається як "секретний файл"), і джерело пошуку ". команда була рішенням.
Ян Вльчинський,

Це має бути головною відповіддю, оскільки це працюватиме з sh, dash та bash.
ахан

3
Для сумісності з Mac OS (середовище розробників) і Travis-CI (тестова середовище) мені довелося використовувати . ./filename. В іншому випадку я отримав би sh: 1: .: filename: not foundпомилку під час запуску тестів на Travis-CI.
Адрієн Джолі

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

Тоді буде добре


Приємно! Я запускаю сервери RHEL та Ubuntu, і у мене завжди є такі невеликі проблеми, як ця у Ubuntu. Мені дуже подобаються RHEL і RHEL, як Linux.
radtek

Прийнята відповідь не працює на Ubuntu 14, це робить!
rohithpr

Додайте додаткове пояснення до своєї відповіді - що це робить? dpkg-reconfigureможе бути недоступним для всіх користувачів, особливо в системах, які не базуються на Debian
Nico Haase

Виправлені мої source: not foundпомилки зі старими клієнтами telnet після оновлення debian, дякую.
бустер


9

Ця проблема трапляється тому, що jenkins Execute Shell запускає сценарій через його / bin / sh

Отже, / bin / sh не знає "джерело"

Вам просто потрібно додати нижній рядок у верхній частині вашого Execute Shell в джинсах

#!/bin/bash

Дане питання не стосується Дженкінса зрештою
Ніко Хааз

8

sourceКоманда вбудована в деякі оболонки. Якщо у вас є сценарій, він повинен вказати, яку оболонку використовувати в першому рядку, наприклад:

#!/bin/bash

Ну, там написано #! / Bin / sh і на іншому Linux, якщо я вручну ввожу sh і запитаю "яке джерело", воно мені каже: source: вбудована команда shell
Мілад

о, так це було для цього рядка. Я завжди дивувався. величезне спасибі!
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, тому для виконання початкової команди ви можете увійти як Root.

sudo -s source ./filename.sh


Це не схоже на правильне рішення. Що робити, якщо користувач не має дозволів sudo? А джерела після цього доступні лише користувачеві адміністратора, що спричинить нові проблеми
Ніко Хааз

0

У Ubuntu замість використання sh scriptname.sh для запуску файлу я використовував. scriptname.sh і це спрацювало! Перший рядок мого файлу містить: #!/bin/bash

використовуйте цю команду для запуску сценарію

.name_of_script.sh

1
На це вже відповіли кілька разів. Будь ласка, надайте більше інформації, якщо ви додасте нову відповідь у такому випадку
Ніко Хааз

-3

Це може допомогти вам, я отримував цю помилку, тому що я намагався перезавантажити свою .profileкоманду, . .profileі вона мала синтаксичну помилку


-6

Оболонка Борна (sh) використовує PATH для пошуку source <file>. Якщо файл, який ви намагаєтеся створити, не стоїть на шляху, ви отримаєте помилку "файл не знайдено".

Спробуйте:

source ./<filename>

5
У публікації сказано, що sh: 1: source: not foundніfile not found
Крістіан Чапаро А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.