Intereting Posts

«Невозможно записать cd в / home / user» при поиске сценария

У меня есть этот скрипт:

echo $HOME cd $HOME cd / cd /usr/local/src/ 

Когда я запускаю его так

 . script.sh 

Я получаю этот вывод:

 /home/user : No such file or directory : No such file or directory : No such file or directory 

Если я запускаю его нормально (я добавил #!/bin/bash перед первой строкой)

 sh script.sh 

Я получаю этот вывод:

 : not found.sh: 2: script.sh /home/user script.sh: 3: Can't cd to /home/user script.sh: 4: Can't cd to / script.sh: 5: Can't cd to /usr/local/src/ 

Сценарий запускался из каталога $HOME каждый раз. Если я запускаю каждую команду один за другим из оболочки, она выполняется без проблем (вызов cd $HOME из $HOME просто не менял каталог).

Что я должен сделать, чтобы сделать эту работу?

У вас есть символы CR (^ M) в вашем скрипте. Преобразуйте его в конец строки Unix (только LF). Портативным способом:

 tr -d '\r' < your_script > output_script 

Некоторые объяснения, основанные на комментарии Оливье Дулака о том, что произошло с символами CR: во-первых, в языке оболочки символ CR не рассматривается как особый символ, например, не рассматривается как пространство и не игнорируется. Я пишу это как ^M ниже.

  • В строке echo $HOME^M выведено содержимое $HOME за которым следует ^M а затем новая строка. Вывод символа CR помещает курсор в первый столбец, но поскольку он сразу же сопровождался новой строкой, это не имело видимого эффекта.

  • В строке cd $HOME^M , поскольку между $HOME и символом CR нет пробела, они оба находятся в одном аргументе $HOME^M , и этот каталог не существует. В сообщении об ошибке символ CR после $HOME был только что выведен, помещая курсор в первый столбец, так что начало строки было перезаписано остальной частью сообщения, если оно есть: «: Нет такого файла или каталога» с bash (ваш первый пример), ничего с тире (ваш второй пример sh script.sh , поскольку #!/bin/bash проигнорирован, так как вы явно попросили запустить скрипт с sh , который, похоже, будет тире в вашем случае). Сообщение об ошибке полностью зависит от оболочки. Например, zsh обнаруживает, что символ CR не печатается и выводит сообщение типа:

    cd: нет такого файла или каталога: / usr / local / src / ^ M

(с символами «^» и «М», а не с символом CR), что позволяет легче обнаружить причину проблемы. В противном случае вам нужно перенаправить / pipe stderr в какую-нибудь утилиту, которая может отображать специальные символы, такие как cat -ve как было предложено Olivier, или hd , что дает последовательность байтов для потока.

Если вы используете set -x вы заметите, почему сбой файла не срабатывает:

 $ . test.sh + . test.sh ++ echo $'/home/braiam\r' /home/braiam ++ cd $'/home/braiam\r' : No such file or directory ++ cd $'/\r' : No such file or directory ++ cd $'/usr/local/src/\r' : No such file or directory 

Как сказал vinc17, просто удалите часть вашего скрипта, и все будет в порядке. Вы можете использовать его решение или использовать dos2unix script.sh , также sed -i 's/\r//' script.sh

Вы также можете использовать команду ниже, чтобы удалить символы CR.

 perl -p -i -e "s/\r//g" script.sh 

Если вы используете vi / vim , вы можете сделать это,

 :set ff=unix 

У меня была такая же проблема, и я исправил ее, преобразов символы EOL в формат UNIX. Легкий способ сделать это:

  • Загрузите файл в Notepad ++
  • Выберите весь текст для преобразования (Ctrl + A)
  • Редактировать> Преобразование EOL> UNIX
  • Сохранить файл

Если уже в формате UNIX выберите другой формат (Windows), а затем вернитесь в UNIX