Ошибка при выполнении сценария оболочки, создающего вывод в Ubuntu в Windows - PullRequest
0 голосов
/ 29 апреля 2018

Мне было сложно выполнять свои сценарии оболочки на bash в Ubuntu для Windows 10. Сценарий очень прост:

# file name: submission.sh
echo "Hello world" > output.txt

Когда я выполнил его с помощью команды sh submission.sh, он выдал ошибку:

$ sh submission.sh
: Directory nonexistentssion.sh: cannot create output.txt

Однако, когда я изменил скрипт на

# file name: submission.sh
echo "Hello world"

и выполнил его с помощью той же команды sh submission.sh, он дал мне правильный вывод

$ sh submission.sh
Hello world

Кажется, что bash в Ubuntu в Windows не может сделать это правильно, когда сценарий направляет вывод в файл. Есть ли какое-либо решение или способ обойти это?

EDIT: Подробности в моей системе:

  • Программа: "Bash на Ubuntu в Windows"
  • ОС: Windows 10 версии 1709

EDIT: Ввод команды непосредственно на терминале работает, т.е.

$ echo "Hello world" > output.txt
$ cat output.txt
Hello world

Я все еще хочу поместить команды в файл и выполнить файл вместо записи команды непосредственно в терминал, и это все еще не решено.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Похоже, у вас есть искаженный текст в nonexistentssion.sh: и No such file or directorytput.txt, что говорит о том, что в файле \r могут быть окончания Windows. Если вы создали сценарий с помощью программы для Windows (например, «Блокнот»), то это может иметь место.

Если у вас есть dos2unix, запустите его на вашем скрипте и попробуйте снова.

Кстати, для дальнейшего использования, sh - это не то же самое, что bash. В этом случае это ничего бы не изменило, но sh - это оболочка POSIX, полная версия bash имеет много расширений, которые не будут работать под sh.

Некоторые платформы запускают sh в качестве символической ссылки на bash, что вводит людей в заблуждение, что они одинаковы, но bash обнаруживает это и переключается в режим POSIX при работе как sh. Это общая проблема здесь.

0 голосов
/ 29 апреля 2018

В вашем файле submission.sh лучше добавить shebang в качестве первой строки. Если вы хотите использовать sh вместо bash, вы должны учесть еще одну вещь: заменить echo на printf для переносимости

.

Ваш код должен выглядеть примерно так:

#!/bin/bash
printf "Hello world!\n" > output.txt

Вы можете вызвать его просто ./submission.sh, и из-за шебанга ваш терминал будет знать, как его открыть [:

P.S. Помните, что из-за стандартного umask в Ubuntu вы можете выполнить chmod u+x submission.sh перед его запуском.

Также обратите внимание, что ваша ошибка, вероятно, вызвана проблемой с разрешениями. Попробуйте добавить разрешения на запись в папку, в которой вы запускаете скрипт.

...