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

92

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

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

sh: 1: source: not found

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

  • 1
    Можно разумно утверждать, что оболочка, которая поддерживает source является «неправильной версией».
  • 1
    Кроме того, сообщение об ошибке source: not found означает, что команда source была оценена правильно, но файл, который она должна была прочитать, не существует.
Показать ещё 1 комментарий
Теги:
sh

11 ответов

83
Лучший ответ

/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.
Показать ещё 2 комментария
88

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

. filename
  • 0
    Мне не разрешено менять скрипт, он отлично работает на сервере Redhat. Но на этом сервере источник, кажется, включен в sh
  • 2
    Если у него есть source он не является строго sh .
Показать ещё 4 комментария
43
$ls -l `which sh`
/bin/sh -> dash

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

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

Тогда это будет ОК

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

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

например

. $FILE

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

. ./$FILE

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

7

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

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

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

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

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

#!/bin/bash
0

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

source profile.txt или source profile.properties

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

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

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

0

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

sudo -s source ./filename.sh

0

Я нашел в файле gnu Makefile на Ubuntu (где/bin/sh → bash)

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

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

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

test:
    $(shell . ./my_script)

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

-1

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

-2

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

Попробуйте:

source ./<filename>
  • 2
    В посте написано sh: 1: source: not found не file not found
Сообщество Overcoder
Наверх
Меню