У вас есть разные настройки пути при запуске cron, поэтому всегда используйте абсолютные пути в сценариях или службах cron.
Ваш второй вопрос прост:
.: .: is a directory
Когда вы выполняете сценарий Bash и Bash сталкивается с ошибкой, он печатает имя сценария и строку, в которой была обнаружена ошибка, примерно так:
script.sh: line X: some message
Командная строка bash . something.sh
пытается запустить .
как сценарий, и, таким образом, потерпеть неудачу. Возможно, вы искали bash ./script.sh
? В этом случае вам не нужно указывать полный путь. Bash сможет найти скрипт, если вы сделаете только bash script.sh
.
Вывод вашего скрипта несколько странный:
: No such file or directorye/<my username>/<long path>
В нем отсутствует информация о файле и часть сообщения об ошибке.
Я предполагаю, что в вашем скрипте есть некоторые непреднамеренные непечатаемые символы. Если он был написан в редакторе, который использует терминаторы строк CR-LF, вы можете импортировать его с помощью fromdos -b script.sh
. Флаг -b
гарантирует, что fromdos
оставит резервную копию вашего оригинального файла. Если вы работаете на Debian, вы можете установить эту программу с пакетом tofrodos
.
Чтобы проверить, нет ли у вас непреднамеренных непечатаемых символов, используйте cat -A
. Может появиться несколько интересных вещей. Например, символы TAB будут печататься как ^I
, а новые строки - как $
. Если в вашем файле есть перевод строки в стиле MS-DOS, он будет выглядеть как ^M$
.
Вам следует
проверить сценарий на наличие «скрытых символов» перед вашей частью «/ home» (это объясняет, что он не может перейти к нему, и почему дисплей также обрезает его часть). Например: cat -ve THEFILE # -e
пометит каждый конец строки $
и -v
отобразит некоторые управляющие символы в форме ^ x
, например: ^ M
для управляющего символа «Возврат каретки».
Исправить: для этого введите рабочий пример в свою оболочку, затем скопируйте его с помощью мыши и отредактируйте сценарий, удалите строку и вставьте скопированную на ее место. (в vi: если сценарий в точности соответствует описанию (а ошибочная строка - это строка 4): вы переходите к строке 4 с помощью 4G
, затем удаляете эту строку с помощью dd
и переходите в режиме вставки в строке выше с помощью: O
(заглавная o). Затем вы можете вставить строки, которые вы скопировали с помощью мыши. затем Escape
, чтобы вернуться в командный режим, и : wq
, чтобы записать изменения в файл и выйти из vi.
Вы можете сравнить вывод $ (pwd) со значением $ PWD: попробуйте заменить: echo $ PWD
с: pwd; echo "PWD = $ PWD"
наконец: bash. Script.sh
должен быть: bash ./script.sh
. вы набрали команду ask bash выполнить "." с аргументом "script.sh", а "." - каталогом, bash жалуется. Когда вызывается таким образом, жалоба обычно находится в форме: имя_программы: какое-то сообщение
Здесь bash пытается выполнить программу .
, поэтому в его сообщении об ошибке ошибочно используется .:
в качестве приглашения имени программы, и отображается сообщение .: это каталог
, указывающий, что он не может выполнить его и почему (это каталог, а не сценарий bash).
Обратите внимание, что когда вы вызываете script.sh таким образом (bash ./script.sh), вы просите текущую оболочку вызвать подоболочку bash
, которая выполнит script.sh
] и выйдите. Только эта подоболочка bash будет: повторять PWD, затем переходить в каталог, повторять новый PWD. Когда этот bash завершает работу, ваша текущая оболочка все еще находится в исходном каталоге. Если вы хотите, чтобы файл вносил изменения в вашу текущую оболочку, вместо этого укажите его: . ./script.sh
или в bash вы также можете source ./script.sh
(примечание: .
- более переносимый способ получить файл) (примечание 2: в последней версии оболочки рекомендуется указать путь к исходному файлу, например: .script.sh
тоже может работать, но рекомендуется указать локальный путь, например: . ./script. sh
)
Можете ли вы выполнить следующую команду и запустить ее снова?
dos2unix script.sh
Если все еще не работает, удалите непечатаемые буквы из файла используя команду ниже
tr -cd "[: print:]" script.sh> script2.sh bash script2.sh