. sh файл не может открыть файл с "." команда - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующий скрипт оболочки (тест. sh)

#!/bin/bash
. /home/detail/env3/bin/activate

Но когда я выполняю его через sh test.sh, он возвращает ошибку:

test.sh: 2: .: Can't open /home/detail/env3/bin/activate

Все разрешения установлены на 777. Может кто-нибудь помочь - что не так?

Результат ls -l /home/detail/env3/bin/activate

enter image description here

-rwxrwxrwx 1 detail detail 2076 Aug 14 10:49 /home/detail/env3/bin/activate

Ответы [ 2 ]

1 голос
/ 23 января 2020

На (старинной) коробке 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.

0 голосов
/ 22 января 2020

На моем компьютере linux я создал два файла в папке / tmp / test1 для имитации вашей ситуации:

// hello.sh
#!/bin/bash
echo 'hello'

и

#!/bin/bash
. /tmp/test1/hello.sh

Я сделал chmod 755 на обоих файлах и запустите test.sh:

mark@whatever@/tmp/test1# ./test.sh

Я вижу, что он выводит hello, поэтому возможная причина: Отсутствие разрешений. На одной из папок /home, /home/detail, /home/detail/env3 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...