Гость Arch Linux (Virtualbox ):Ошибка vboxdrv.service при запуске

Проблема здесь заключается в символе !, который в bash, когда интерактивен, даже внутри двойных кавычек вызывает расширение истории .

Эта функция взята из csh (, где она на самом деле хуже ), а также встречается в bash и zsh, но в остальном не является стандартной shфункцией.

В bashи zsh, в отличие от csh, раскрытие истории не происходит внутри одинарных кавычек, так что sed '0,6!d'будет в порядке. Но sed "0,6!d"не в порядке. В интерактивных оболочках bash!dзаменяется последней командой, содержащей d.

Вы можете удалить специальное значение !с помощью:

sed "0,$line_number"'!d'

Я лично отключил функцию расширения истории, так как современные оболочки имеют гораздо лучшие интерактивные эквиваленты. Я отключил его в zshс помощью set +o banghist, вы можете отключить его в bashсset +o histexpand(на самом деле, zshдобавил histexpandв качестве псевдонима к banghistв 3.1.2 в 1997 году для совместимости с bash, поэтому set +o histexpandбудет работать и в zsh). В (t)cshвы можете отключить расширение истории с помощью set histchars. Эквивалент histchars=на самом деле также работает в bashи zsh.

Обратите внимание, что адрес 0является расширением GNU sed. Портативно вы можете использовать headвместо (, что также будет более эффективным ):

.

head -n "$line_number"

С sed, портативно, вы бы использовали:

sed "${line_number}q"

Что также более эффективно, поскольку sedостанавливает чтение после $line_numberстроки вместо того, чтобы продолжать чтение, но отбрасывает все остальные строки.

2
07.04.2020, 13:57
0 ответов

Теги

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