Сценарий оболочки KSH не будет выполнен и возвращает 127 (не найдено) - PullRequest
2 голосов
/ 14 апреля 2010

Может кто-нибудь просветить меня, почему следующее не сработает?

$ groups
  staff btgroup
$ ls -l
  total 64
  -rw-rw----    1 sld248   btgroup       26840 Apr 02 13:39 padaddwip.jks
  -rwxrwx---    1 sld248   btgroup        1324 Apr 02 13:39 padaddwip.ksh
$ ./padaddwip.ksh
  ksh: ./padaddwip.ksh:  not found.
$ echo $?
  127

Это почти идентично другому сценарию, который работает просто отлично. Я не вижу никаких различий между ними с точки зрения прав доступа или владения.

Ответы [ 4 ]

4 голосов
/ 14 апреля 2010

Возможны 2 проблемы:

  • Неверная строка Шебанга (как намекает призрак)

  • Сценарий был сохранен из Windows иимеет окончания строки DOS.

Для последнего выполните

head padaddwip.ksh | cat -vet | head -1

Команда должна создать строку Шебанга, НЕ заканчивающуюся ^M.Если он заканчивается на ^M, это файл в кодировке DOS, и исправление:

cp padaddwip.ksh padaddwip.ksh.bak
dos2unix padaddwip.ksh.bak > padaddwip.ksh
./padaddwip.ksh

В системах без dos2unix вы можете использовать

cat padaddwip.ksh.bak | tr -d "\r" > padaddwip.ksh
1 голос
/ 15 апреля 2010

Другой способ избавить ваши скрипты от надоедливых символов ^M - открыть файл в vi и набрать :%s/^M//g (sed внутри vi), где ^M здесь создается путем ввода Ctrl-V затем Ctrl-M. Мне лично нравится этот метод, потому что вам не нужно создавать файл резервной копии, и вы сразу видите результаты - просто моя привычка OCD -

Кроме того, у меня были некоторые странные проблемы с использованием tr и управляющих символов, таких как \r, возможно, это была проблема, связанная с оболочкой или сайтом, но в таких случаях мне нужно было использовать либо вышеуказанный метод, либо sed из командной строки ... очень похоже на то, что DVK показывает выше; например sed -e 's/^M//g' padaddwip.ksh.bak > padaddwip.ksh, где вы создаете ^M, выполняя Ctrl-V, а затем Ctrl-M (в режиме редактора vi).

1 голос
/ 14 апреля 2010

просто предположение, проверь свой шебанг в padaddwip.ksh. это должно быть что-то вроде #!/bin/ksh. Если нет, используйте which ksh, чтобы увидеть, где установлен ваш ksh. Кроме того, вы можете выполнить ваш скрипт, вызвав интерпретатор (ksh), например

$ /bin/ksh padaddwip.ksh

еще один способ сделать это, изменив свой шебанг на #!/usr/bin/env ksh

Также убедитесь, что пользователь, выполняющий скрипт, имеет свою основную группу как btgroup

0 голосов
/ 26 апреля 2010

Шебанг плохой.

протестируйте сценарий с помощью интерпретатора оболочки в командной строке.

ksh padaddwip.ksh
...