Я не получаю ту же ошибку в моей системе.
ОБНОВЛЕНИЕ: См. Два последних абзаца для моего лучшего предположения о том, что происходит.
МойПервым лучшим предположением было то, что вы можете решить проблему, изменив 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
для его выполнения.Если я правильно угадаю, дайте нам знать, и мы, возможно, сможем найти решение.