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


148

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

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

sh: 1: source: not found

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


1
Можно разумно утверждать, что поддерживаемая оболочка sourceявляется «неправильной версией».
Уильям Перселл

1
Кроме того, сообщение об ошибке source: not foundозначает, что sourceкоманда была оценена правильно, но файл, который она должна была прочитать, не существует.
Саймон Рихтер

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

Ответы:


152

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


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

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


Ницца! Я использую серверы RHEL и Ubuntu, и у меня всегда есть небольшие проблемы, такие как этот с Ubuntu. Мне очень нравятся RHEL, а RHEL - Linux.
Радтек

Принятый ответ не работает на Ubuntu 14, этот работает!
rohithpr

Пожалуйста, добавьте дополнительное объяснение к вашему ответу - что это делает? dpkg-reconfigureможет быть недоступно для всех пользователей, особенно в системах, которые не основаны на Debian
Нико Хаазе

Исправлены мои source: not foundошибки со старыми клиентами telnet после обновления Debian, спасибо.
bjoster


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

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


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

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

-3

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


-6

Bourne shell (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.