На (старинной) коробке RHEL 5 Linux я создал файл xyz.sh
со строкой CRLF, заканчивающейся на единственной строке;
0x0000: 2E 20 70 71 72 2E 73 68 0D 0A . pqr.sh..
0x000A:
Я создал файл pqr.sh
с обычным Unix окончания строк:
echo $0 at work
Я попытался запустить первый скрипт с sh
:
$ sh xyz.sh
: No such file or directory
$ bash xyz.sh
xyz.sh: line 1: .: $'pqr.sh\r': file not found
$
Когда я запускаю его через программу шестнадцатеричного дампа, я получаю:
$ sh xyz.sh 2>&1 | xxd -g 1
0000000: 78 79 7a 2e 73 68 3a 20 6c 69 6e 65 20 31 3a 20 xyz.sh: line 1:
0000010: 70 71 72 2e 73 68 0d 3a 20 4e 6f 20 73 75 63 68 pqr.sh.: No such
0000020: 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f file or directo
0000030: 72 79 0a ry.
$
Когда я исключаю CR из xyz.sh
и запускаю его, я получаю:
$ sh xyz.sh
xyz.sh at work
$
Учитывая этот эксперимент, я делаю вывод, что проблема в вопросе, вероятно, возникает из-за файла test.sh
имеет окончания строки CRLF, поэтому, когда оболочка обрабатывает его, она пытается открыть файл $'/home/detail/env3/bin/activate\r'
в записи Bash. Сообщение об ошибке также предполагает, что оболочка в /bin/sh
на самом деле не Bash (или Bash со временем изменила свои сообщения об ошибках). Выполнение sh --version
может быть или не быть информативным.
Вы можете доказать проблему CRLF с:
$ file xyz.sh
xyz.sh: ASCII text, with CRLF line terminators
$
, за исключением того, что вы укажете test.sh
. Вы можете преобразовать файл в Unix окончания строк, используя vim
и :set fileformat=unix
перед записью файла обратно на диск:
$ file xyz.sh
xyz.sh: ASCII text
$
Это тестирование ничего не говорит о том, имеет ли файл в /home/detail
CRLF (DOS-стиль) окончания строк; оболочка еще не дошла до чтения этого файла.
FWIW: dash
0.5.9, работающий на Ma c (с MacOS Mojave 10.14.6), выдает еще одно сообщение об ошибке:
$ dash xyz.sh
: not found.: pqr.sh
$ dash xyz.sh 2>&1 | xxd -g 1
00000000: 78 79 7a 2e 73 68 3a 20 31 3a 20 2e 3a 20 70 71 xyz.sh: 1: .: pq
00000010: 72 2e 73 68 0d 3a 20 6e 6f 74 20 66 6f 75 6e 64 r.sh.: not found
00000020: 0a
$
Аналогично, ksh
производит:
$ ksh xyz.sh
: cannot open [No such file or directory]
$ ksh xyz.sh 2>&1 | xxd -g 1
00000000: 78 79 7a 2e 73 68 5b 31 5d 3a 20 2e 3a 20 70 71 xyz.sh[1]: .: pq
00000010: 72 2e 73 68 0d 3a 20 63 61 6e 6e 6f 74 20 6f 70 r.sh.: cannot op
00000020: 65 6e 20 5b 4e 6f 20 73 75 63 68 20 66 69 6c 65 en [No such file
00000030: 20 6f 72 20 64 69 72 65 63 74 6f 72 79 5d 0a or directory].
$
Все это говорит о том, что оболочка в /bin/sh
на машине ОП не является Bash, Da sh или K sh.