Я советую Вам фиксировать свои окончания строки.
Преобразовать файл в \n
окончания строки:
:%s/\r$
Преобразовать файл в \r\n
окончания строки (не протестированы):
:%s/[^\r]\n/\r\n/
Можно заставить энергию выполнить одну из этих операций автоматически при открытии файла:
autocmd BufRead, * normal :%s/\r$
Вы могли также использовать dos2unix
и unix2dos
утилиты.
sudo su - <<'EOF'] # do stuff... EOF
Это работает, но с ограничением: скрипт передается в оболочку на стандартном входе, так что вы не сможете использовать стандартный вход для чего-то другого, например, для чтения имени пользователя для создания.
Простой способ сохранить стандартный вход - передать команду оболочки в качестве аргумента.
Обратите внимание, что sudo su
является избыточным - sudo
выполняет указанную команду от имени root, и это единственное предназначение su
. Используйте sudo -i
вместо sudo su -
, если вы хотите запустить оболочку от имени root - что, вероятно, здесь не нужно - или sudo sh
, чтобы просто запустить оболочку от имени root.
sudo sh -c '
# do stuff...
'
Это делает неудобным использование одиночной кавычки в фрагменте оболочки. Вы можете использовать '\''
, чтобы поместить одиночную кавычку внутрь однокавычного литерала. Если вы хотите сохранить здесь структуру документа, есть несколько способов. Самый простой - передать здесь документ на другой дескриптор. Однако для этого в конфигурации sudo должна быть активирована опция closefrom_override
, что по умолчанию не так; по умолчанию sudo
закрывает все файловые дескрипторы, кроме stdin, stdout и stderr.
sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF
Если вы хотите, чтобы ваш код был переносимым на машины, где эта опция не активирована, вы можете прочитать скрипт из heredoc и передать его в оболочку в качестве аргумента.
script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"
Кроме того, если вы хотите, чтобы sudo скрипт мог читать из терминала, вы можете передать тело скрипта на стандартном входе. Ограничением такого подхода является то, что он не позволяет перенаправлять ввод общего скрипта.
sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF
su -c '. /dev/fd/4' 4<<\SCRIPT
...automated stuff here...
....then for interactive...
exec </dev/tty
SCRIPT
Должен сделать это. Сделайте это в соответствии с вашими потребностями - но он переключит контексты, и статус возврата оболочки будет в $?
, когда вы закончите с этим.
При условии, что пользователь, ссылающийся на sudo
может назначить tty
:
Defaults someuser:requiretty
ans было дано разрешение на выполнение необходимых команд в качестве root:
Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF
сценарий, содержащий sudo
вызовы, будет интерактивным. Вы можете передать имя пользователя в качестве позиционного аргумента:
sudo useradd $1
sudo passwd $1
и проверить статус возврата, как обычно, с помощью $?
.