Почему этот скрипт оболочки tcsh выдает ошибку при установке PATH LD_LIBRARY_PATH - PullRequest
1 голос
/ 17 ноября 2011

Я создал скрипт оболочки tcsh следующим образом:

#!/bin/tcsh

setenv PATH  ""
setenv PATH  .:$HOME/bin:/usr/sbin:/usr/bin:/bin:/usr/X11R6/bin:/usr/local/cuda/bin:/usr/local/bin:/usr/bin:$PATH

setenv LD_LIBRARY_PATH ""
setenv LD_LIBRARY_PATH .:/usr/local/cuda/lib:/usr/local/cuda/lib64/:/usr/local/cuda:/usr/lib:/usr/lib32:/usr/local/cuda/bin:/usr/local/lib/:${LD_LIBRARY_PATH}

Затем я сделал этот скрипт исполняемым, и когда я пытаюсь выполнить его как

. / Script.sh, онвыдает следующие ошибки:

script.sh: 3: setenv: не найдено

script.sh: 4: setenv: не найдено

script.sh: 6: setenv:не найдено

script.sh: 7: setenv: не найдено

Есть ли какие-нибудь указатели, как установить эти пути в моем скрипте оболочки?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

Я не получаю ту же ошибку в моей системе.

ОБНОВЛЕНИЕ: См. Два последних абзаца для моего лучшего предположения о том, что происходит.

МойПервым лучшим предположением было то, что вы можете решить проблему, изменив shebang

#!/bin/tcsh

на

#!/bin/tcsh -f

(Или используйте

#!/bin/csh -f

Функции, которые добавляет tcshоригинальный csh в основном полезен для интерактивного использования, а не для создания сценариев.)

Опция -f указывает tcsh not обрабатывать файлы .login и .cshrc или .tcshrc, когдаэто начинается.Обычно вы не хотите, чтобы скрипт делал это;это делает поведение скрипта зависимым от вашей настройки среды.Возможно, в вашем .login есть что-то странное с setenv, хотя я не могу придумать, что это может быть.Попробуйте добавить -f и посмотрите, поможет ли это.Даже если этого не произойдет, вы все равно должны это сделать.

(И не используйте -f для /bin/sh или /bin/bash сценариев; это означает что-то другое и не нужно.)

Некоторые другие наблюдения:

Установка $PATH и $LD_LIBRARY_PATH для пустой строки бесполезна.Просто удалите эти две строки.

РЕДАКТИРОВАТЬ:

Перечитывая ваш вопрос, я вижу, что вы там делаете.Вы устанавливаете $PATH в пустую строку, а затем добавляете к ней больше текста:

setenv PATH ""
setenv PATH this:that:$PATH

Это имеет больше смысла, чем я думал, но все же проще написать одну команду:

setenv PATH this:that

Вставка . в ваш $PATH, , особенно в начале, плохая идея.Подумайте о том, что произойдет, если вы запустите скрипт в каталоге, где кто-то разместил команду с именем ls, которая делает что-то неприятное.Если вы хотите выполнить команду в текущем каталоге, используйте ./command.(Поместить . в end из $PATH безопаснее, но все же не очень хорошая идея.)

(И использовать tcsh или csh в качестве языка сценариев (в отличие отИнтерактивная оболочка) также считается плохой идеей. Эта статья , даже если она не убедит вас отказаться от сценариев tcsh, по крайней мере заставит вас осознать подводные камни.)

О, и если это скрипт tcsh, почему вы называете его script.sh?Суффиксы в именах файлов не требуются в Unix-подобных системах (в отличие от Windows), но обычно суффикс .sh подразумевает, что это скрипт оболочки Bourne.Назовите это script.tcsh, или script.csh, или просто script.

РЕДАКТИРОВАТЬ:

При более внимательном рассмотрении полученного сообщения об ошибке,похоже, что ошибки приходят из /bin/sh, , а не из tcsh.

В моей системе, когда я изменяю setenv на Setenv (несуществующая команда), запускаю командускрипт с tcsh дает мне:

Setenv: Command not found.
Setenv: Command not found.
Setenv: Command not found.
Setenv: Command not found.

, что не соответствует сообщениям об ошибках, которые вы нам показали.Когда я запускаю его явно как /bin/sh foo.tcsh (оставляя только команды setenv), я получаю:

foo.tcsh: 3: setenv: not found
foo.tcsh: 4: setenv: not found
foo.tcsh: 6: setenv: not found
foo.tcsh: 7: setenv: not found

, который соответствует формату ошибок, которые вы получили.

Вы говоритечто /bin/tcsh --version дает правильные результаты, так что это не проблема.Каким-то образом сценарий выполняется /bin/sh, а не tcsh.

Вот мое лучшее предположение о том, что происходит.Вы работаете в Cygwin или, возможно, MSYS, но вы вызываете свой скрипт из оболочки cmd, а не из оболочки Cygwin.Ваша система Windows настроена на распознавание суффикса .sh, указывающего, что файл является сценарием, который должен выполняться C:\cygwin\bin\sh.exe (как я уже упоминал ранее, суффиксы файлов обычно не имеют значения в Unix или в среде Cygwin,но они работают в Windows).

Возможно, самое простое решение - переписать скрипт, чтобы он соответствовал синтаксису оболочки Bourne.Но должны быть способы заставить Windows вызывать Cygwin tcsh для его выполнения.Если я правильно угадаю, дайте нам знать, и мы, возможно, сможем найти решение.

2 голосов
/ 17 ноября 2011

Я не вижу ничего плохого в вашем сценарии. Он отлично работает на моей коробке.

Единственная причина этой ошибки (о которой я могу подумать) заключается в том, что tcsh почему-то не используется в качестве интерпретатора.

Я могу воспроизвести ошибку, если добавлю перевод строки до #!/bin/tcsh. Когда shebang не является первым символом в файле, директива интерпретатора не вступает в силу, и ваша текущая оболочка используется (я предполагаю, что ваша оболочка не является вариантом c-shell (csh или tcsh)?).

Итак, убедитесь, что #!/bin/tcsh действительно является первой строкой в ​​файле, без пробелов ранее.


Чтобы определить, какой интерпретатор фактически используется, попробуйте добавить это в ваш скрипт:

echo "$shell"  ## prints shell name if tcsh or csh
echo "$BASH"   ## prints /bin/bash if bash

пример:

[me@home]$ bash x.sh  # run using bash

/bin/bash

[me@home]$ tcsh x.sh # run using tcsh
/bin/tcsh
BASH: Undefined variable.
1 голос
/ 05 февраля 2015

только что столкнулся с этой проблемой, и оказалось, что это связано с тем, что в файле сценария есть Windows EOL.Как только я это почистил, все было хорошо.

...