исходная команда не найдена в оболочке sh

148

У меня есть скрипт, который использует shоболочку. Я получаю сообщение об ошибке в строке, которая использует sourceкоманду. Кажется source, не входит в мою shоболочку.

Если я явно пытаюсь запустить sourceиз оболочки, я получаю:

sh: 1: source: not found

Должен ли я как-то установить «источник»? У меня неправильная версия sh?

Milad
источник
1
Можно разумно утверждать, что поддерживаемая оболочка sourceявляется «неправильной версией».
Уильям Перселл
1
Кроме того, сообщение об ошибке source: not foundозначает, что sourceкоманда была оценена правильно, но файл, который она должна была прочитать, не существует.
Саймон Рихтер
4
Невозможно «установить», source потому что это особенность оболочки. Он не может быть реализован как внешняя команда.
Кристофер Шульц

Ответы:

152

/bin/shобычно это какая-то другая оболочка, пытающаяся имитировать «Шелл». Многие дистрибутивы используют /bin/bashдля sh, это поддерживает source. На Ubuntu, тем не менее, /bin/dashиспользуется, который не поддерживает source. Большинство оболочек используют .вместо source. Если вы не можете редактировать скрипт, попробуйте изменить оболочку, которая его запускает.

choroba
источник
2
Спасибо! Замена / bin / sh на / bin / bash работала в Ubuntu! Мне любопытно, почему это означает, что на Ubuntu bash is sh?
Милад
1
@Milad: В последнее время Ubuntus, /bin/shзвонки /bin/dash. Традиционно /bin/shназывается /bin/bashрежим sh-совместимости.
Чороба
@ Милад Я думаю, что это не работает на Ubuntu 14.04. Какая у вас версия ОС?
Реза Амери
1
Может быть, поможет известный - если у вас есть каскадные сценарии, то переименуйте все "sh -> bash". Спасибо. :-)
БГ Бруно
Я не сразу понял, как решить эту проблему, к сожалению, но он поставил меня на правильный путь. Мне пришлось добавить SHELL := /bin/bashв начало моего Makefile.
anon58192932
136

В Bourne shell (sh) используйте. команда для получения файла

. filename
Гуру
источник
Мне не разрешено менять скрипт, он отлично работает на сервере Redhat. Но на этом сервере источник, кажется, включен в sh
Milad
2
Если sourceэто не так строго sh.
tripleee
4
У меня были проблемы такого типа на Дженкинсе (попытка найти файл, хранящийся как «секретный файл») и поиск источника с помощью «.» Команда была решением.
Ян Влчинский
Это должен быть главный ответ, так как он будет работать с sh, dash и bash.
ахан
4
Для совместимости с Mac OS (среда разработки) и Travis-CI (среда тестирования) мне пришлось использовать . ./filename. В противном случае я получил бы sh: 1: .: filename: not foundошибку при запуске тестов на Travis-CI.
Адриен Джоли
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

Тогда все будет хорошо

shlsy
источник
Ницца! Я использую серверы RHEL и Ubuntu, и у меня всегда есть небольшие проблемы, такие как этот с Ubuntu. Мне очень нравятся RHEL, а RHEL - Linux.
Радтек
Принятый ответ не работает на Ubuntu 14, этот работает!
rohithpr
Пожалуйста, добавьте дополнительное объяснение к вашему ответу - что это делает? dpkg-reconfigureможет быть недоступно для всех пользователей, особенно в системах, которые не основаны на Debian
Нико Хаазе
Исправлены мои source: not foundошибки со старыми клиентами telnet после обновления Debian, спасибо.
bjoster
31

sourceВстроенной является bashism. Напишите это просто как .вместо.

например

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

Трэвис Кларк
источник
9

Эта проблема возникает из-за того, что jenkins Execute Shell запускает скрипт через его / bin / sh

Следовательно, / bin / sh не знает «источник»

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

#!/bin/bash
Мойтаба Юсефи
источник
Данный вопрос никак не связан с Дженкинсом
Нико Хаазе
8

Команда sourceвстроена в несколько оболочек. Если у вас есть скрипт, он должен указать, какую оболочку использовать в первой строке, например:

#!/bin/bash
ма
источник
Ну, там написано #! / Bin / sh и в другом linux, если я вручную введу sh и спросю "какой источник", он мне скажет: source: встроенная команда оболочки
Milad
о, вот для чего эта линия. Я всегда задавался вопросом. огромное спасибо!
CommonSenseCode
5

Я столкнулся с этой ошибкой, когда пытался вызвать исходную команду из командной оболочки #Jenkins.

source profile.txt или source profile.properties

Замена для исходной команды заключается в использовании,

. ./profile.txt или . ./profile.properties

Примечание. Между двумя точками есть пробел (.)

GangaRam Dewasi
источник
0

Я нашел в Makefile GNU на Ubuntu, (где / bin / sh -> bash)

Мне нужно было использовать. команда, а также укажите целевой скрипт с префиксом ./ (см. пример ниже)

источник не работал в этом случае, не уверен, почему, так как он должен вызывать / bin / bash ..

Моя переменная окружения SHELL также установлена ​​в / bin / bash

test:
    $(shell . ./my_script)

Обратите внимание, что этот образец не включает символ табуляции; пришлось форматировать для обмена стека.

Горд Подождите
источник
0

source - это встроенная команда bash, поэтому для выполнения команды source вы можете войти в систему как Root.

sudo -s source ./filename.sh

свати джайн
источник
Это не похоже на правильное решение. Что делать, если у пользователя нет разрешений sudo? И исходный материал впоследствии будет доступен только как администратор, что вызовет новые проблемы
Нико Хаас
0

В Ubuntu вместо файла sh scriptname.sh для запуска файла я использовал. scriptname.sh и все заработало! Первая строка моего файла содержит: #!/bin/bash

используйте эту команду для запуска скрипта

.name_of_script.sh
DInfo2019
источник
1
На это уже отвечали несколько раз. Пожалуйста, предоставьте больше информации, если вы добавите новый ответ в таком случае
Нико Хаазе
-3

Это может помочь вам, я получаю эту ошибку, потому что я пытался перезагрузить мой .profileс помощью команды, . .profileи у него была синтаксическая ошибка

Колоб Каньон
источник
-6

Bourne shell (sh) использует PATH для поиска в source <file>. Если файл, который вы пытаетесь найти, не находится на вашем пути, вы получите сообщение об ошибке «файл не найден».

Пытаться:

source ./<filename>
MOSU
источник
5
В посте сказано sh: 1: source: not foundнетfile not found
Кристиан Чапарро А.