Я делаю следующее внутри файла make
pushd %dir_name%
и я получаю следующую ошибку
/bin/sh : pushd : not found
Может кто-нибудь сказать мне, почему появляется эта ошибка? Я проверил свою переменную $ PATH, и она содержит / bin, поэтому не думаю, что это вызывает проблему.
pushd
. Толкается в твоем$PATH
?Ответы:
pushd
являетсяbash
усовершенствованием оболочки Bourne Shell, указанной в POSIX.pushd
не может быть легко реализован как команда, потому что текущий рабочий каталог - это функция процесса, которая не может быть изменена дочерними процессами. (Гипотетическаяpushd
команда может выполнитьchdir(2)
вызов, а затем запустить новую оболочку, но ... она не очень удобна.)pushd
- это встроенная оболочка, как иcd
.Итак, либо измените свой сценарий, чтобы начать с него,
#!/bin/bash
либо сохраните текущий рабочий каталог в переменной, выполните свою работу, а затем вернитесь обратно. Зависит от того, нужен ли вам сценарий оболочки, который работает в очень ограниченных системах (скажем, на сервере сборки Debian), или если вы всегда в порядке, требуяbash
.источник
SHELL = /bin/bash
а не запуск сценария с#!/bin/bash
.test1
Мой ответ stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/… .#!/bin/bash
это первая строка файла.Добавить
в верхней части вашего make-файла я нашел его по другому вопросу. Как я могу использовать синтаксис Bash в целях Makefile?
источник
Обходным путем для этого было бы получение переменной текущего рабочего каталога. Затем вы можете выйти из него, чтобы сделать что угодно, а затем, когда вам это нужно, вы можете снова войти.
т.е.
источник
cd
войти в каталог, который хотите, и после этогоcd -
, нет необходимости использовать эту$oldpath
переменную, если вы не будете использоватьcd
промежуточный. Интересно то,pushd
что каждый раз, когда вы его используете, вы помещаете каталог в стек, а после этого вы можете вернуться к последнему используемомуpopd
, поэтому имеет смысл использовать его, когда вы переходите в более чем один каталог и хотите верный путь назад.(cd /new_path ; command )
Это потому, что pushd - встроенная функция в bash. Таким образом, он не связан с переменной PATH, а также не поддерживается / bin / sh (который используется make по умолчанию. Вы можете изменить это, установив SHELL (хотя он не будет работать напрямую (test1)).
Вместо этого вы можете выполнить все команды
bash -c "..."
. Это заставит команды, включая pushd / popd, выполняться в среде bash (test2).При запуске make test1 и make test2 он дает следующее:
Для test1, даже если bash используется в качестве оболочки, каждая команда / строка в правиле запускается сама по себе, поэтому команда pushd запускается в другой оболочке, чем popd.
источник
tcsh
(а может бытьcsh
?)>
$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
но я просто разделил его до общей строки для ответа. Приглашение в DOS также заканчивается на>
по умолчанию ($P$G
IIRC), и мне это нравится.Ваша оболочка (/ bin / sh) пытается найти "pushd". Но он не может его найти, потому что pushd, popd и другие подобные команды встроены в bash.
Запустите сценарий, используя Bash (/ bin / bash) вместо Sh, как вы делаете сейчас, и он будет работать
источник
Затем выберите
no
.источник
Синтез на основе других ответов:
pushd
специфичен для bash, и вы делаете, что используете другую оболочку POSIX. Существует простой обходной путь - использовать отдельную оболочку для части, для которой нужен другой каталог, поэтому просто попробуйте изменить его на:(Я заменил длинный путь расширением переменной. Я, вероятно, есть один в make-файле, и он явно расширяется до текущего каталога).
Поскольку вы запускаете его из make, я бы, вероятно, также заменил тест правилом make. Просто
(удалил префикс текущего каталога; вы все равно использовали относительный путь в некоторых точках) И чем просто сделать правило зависимым от
gen/SvcGenLog
. Было бы немного более удобным для чтения , и вы можете сделать это зависеть отgenscript/genmakefile.pl
слишком, так чтоMakefile
вgen
будет восстановлен , если вы измените сценарий. Конечно, если что-то еще влияет на содержимоеMakefile
, вы можете сделать правило зависимым и от этого.источник
Обратите внимание, что каждая строка, выполняемая файлом make, в любом случае запускается в своей собственной оболочке. Если вы смените каталог, это не повлияет на последующие строки. Таким образом, вы, вероятно, мало используете pushd и popd, ваша проблема скорее противоположная, проблема с тем, чтобы каталог оставался измененным столько, сколько вам нужно!
источник
Запустите "apt install bash". Он установит все, что вам нужно, и команда заработает.
источник
вот способ указать
ш -> баш
запустите эту команду на терминале
После этого вы должны увидеть
указать на / bin / bash (а не на / bin / dash)
Ссылка
источник
Это должно помочь:
Скобки запускают новую дочернюю оболочку, таким образом,
cd
каталог изменяет только дочернюю оболочку, и любая команда после нее в круглых скобках будет выполняться в этой папке. Как только вы выйдете из скобок, вы снова окажетесь там, где были раньше.источник