Zsh, возможно добавляющий кавычки к значению переменной (работает в ударе хотя),

Необходимо прочитать страницу Arch Wiki на sudo.

sudo ("заменяют пользователем, делают"), позволяет системному администратору делегировать полномочия, чтобы дать определенным пользователям (или группы пользователей) способность выполнить некоторых (или все) команды как корень или другой пользователь при обеспечении журнала аудита команд и их аргументов.

Можно установить sudo из репозиториев и затем настраивают его, чтобы позволить Вашему пользователю, jack, доступ к привилегированным командам путем редактирования /etc/sudoers. Удостоверьтесь, что Вы делаете это использование visudo команда.

Дать пользователю jack полные полномочия пользователя root, Вы добавили бы эту строку:

jack ALL=(ALL) ALL

2
15.10.2013, 01:09
2 ответа

В нормальных оболочках стиля Границы, таких как Оболочка Bourne, тире, ksh и удар, синтаксис $variable означает, “принимают значение переменной, разделяют его на отдельные слова где символы от IFS появитесь, и рассматривайте каждое слово как подстановочный шаблон имени файла и разверните его, если оно соответствует одному из большего количества файла”. Если variable массив, это происходит с первым элементом массива, и другие элементы проигнорированы.

В zsh, синтаксисе $variable означает, “принимают, значение переменной, кроме удаляют его, если это пусто”. Если variable массив, это происходит со всеми элементами массива. Энтузиасты Zsh считают zsh путь выше.

В zsh можно записать $=variable выполнить разделение слова. Это не лучший способ сделать то, что Вы делаете, все же. Ваша функция удара не справляется с пробелом в именах файлов и использованием $=variable в zsh не был бы также. Вот другой способ проанализировать аргумент, который работает и в ударе и в zsh и справляется с любым символом кроме : в имени файла. Если аргумент содержит два двоеточия, то все после первого двоеточия удалено, и часть между первым двоеточием и вторым двоеточием добавляется как отдельный аргумент, которому предшествует a + знак. Это немного длиннее, чем Ваш код, но менее твердо понять, и это не дросселирует при первой подсказке пространства в имени файла.

vl () {
  local suffix
  case $1 in
    *:*:*) suffix=${1#*:};; set -- "${1%%:*}" "+${suffix%%:*}";;
  esac
  vim "$@"
}
6
27.01.2020, 21:51

Это - хитрое :) Одно обходное решение должно определить функцию как это:

vl() { cmd=$(echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'); eval "vim $cmd"; }

Обратите внимание, что обходное решение является использованием eval, не другие незначительные модификации, которые я должен был сделать, потому что я испытываю недостаток в необходимом редактировании-fu stackexchange 8-)

2
27.01.2020, 21:51
  • 1
    Но, можно ли объяснить относительно того, почему это происходит? Без этого я невежествен. –  Abhijeet Rastogi 14.10.2013, 13:50
  • 2
    Поскольку по умолчанию zsh не выполняет слово, разделяющее после расширения параметра. В ударе закрыло кавычки использование, расширения считают плохой практикой из-за wordsplitting. В ударе Ваша функция "работает" из-за wordsplitting, но может легко повредиться, должен, файл с пробелом дан ему. Осторожный –  llua 14.10.2013, 15:54
  • 3
    Для принуждения wordsplitting в zsh сделать vim $=cmd. Создание cmd в массив также вызвал бы wordsplitting: cmd=( $(echo ...) ); vim $cmd. –  Matt 14.10.2013, 23:32

Теги

Похожие вопросы