Во-первых, обратите внимание, что синтаксис для закрытия 5>&-
или 6<&-
В зависимости от того, читается ли дескриптор файла из записи или из чтения. Кажется, существует опечатка или форматирующий незначительный сбой в том сообщении в блоге.
Вот прокомментированный сценарий.
exec 5>/tmp/foo # open /tmp/foo for writing, on fd 5
exec 6&5 # write to fd 5, i.e., /tmp/foo
done #
Здесь нет никакого закрытия. Поскольку все вводы и выводы идут в то же место в этом простом примере, использование дополнительных дескрипторов файлов не необходимо. Вы могли записать
cat /tmp/foo
Используя явные дескрипторы файлов становится полезным, когда Вы хотите записать в несколько файлов в свою очередь. Например, рассмотрите сценарий что выходные данные в файл вывода данных и данные регистрации к файлу журнала и возможно сообщениям об ошибках также. Это означает три канала вывода: один для данных, один для журналов и один для ошибок. С тех пор существует только два стандартных дескриптора для вывода, одна треть необходима. Можно звонить exec
открыть выходные файлы:
exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3
…
if something_bad_happens; then echo error message >&2; fi
exec >&- # close the data output file
echo "output file closed" >&3
Комментарий об эффективности входит, когда у Вас есть перенаправление в цикле, как это (предположите, что файл пуст для начала):
while …; do echo $a >>/tmp/bar; done
При каждом повторении открывается программа /tmp/bar
, ищет в конец файла, добавляет некоторые данные и закрывает файл. Более эффективно открыть файл раз и навсегда:
while …; do echo $a; done >/tmp/bar
Когда существует несколько перенаправлений, происходящих в разное время, звоня exec
выполнить перенаправления вместо того, чтобы перенести блок в перенаправление становится полезным.
exec >/tmp/bar
while …; do echo $a; done
Вы найдете несколько других примеров перенаправления путем просмотра io-redirection
наклейте этот сайт.
Предположим, что у Вас есть этот другой набор настроек в /tmp/myvimrc
. Если мое чтение man vim
корректно, можно запустить энергию с этого набора настроек с помощью следующего:
$ vim -u /tmp/myvimrc
Таким образом, для создания этого опцией для остальной части сессии я создал бы функцию, которая устанавливает это как псевдоним для vim
. Таким образом, в bash
Я вставил бы что-то вроде этого мой .bashrc
файл:
function vimswitch {
alias vim='vim -u /tmp/myvimrc'
}
Затем когда я хотел свои новые настройки энергии, я буду просто работать:
$ vimswitch
Обратите внимание, что я не сохранил бы myvimrc в /tmp
так как это могло легко быть убрано на перезагрузку. Если Вы используете оболочку кроме bash
это должно все еще быть возможно, но синтаксис мог отличаться немного.
Можно использовать переменную среды VIMINIT для переопределения использования обычного .vimrc
при хранении других частей процесса инициализации. VIMINIT должен быть установлен на одну или несколько команд экс-стиля (команды “двоеточия”; используйте канал (|
) разделить несколько команд), не только путь к другому файлу инициализации.
VIMINIT='so /tmp/myvimrc'; export VIMINIT
vim whatever # uses /tmp/myvimrc, not ~/.vimrc
Основное различие от использования -u
это, VIMINIT все еще позволит другим частям процесса инициализации использоваться (например, система vimrc
, evim.vim
(если применимо), и так далее).
VIMINIT
переменная при входе через ssh Вы могли использовать файл ~/.ssh/environment
. Этот файл мог использоваться только для установки переменных среды, поэтому только запись, которую необходимо добавить: VIMINIT='so /tmp/myvimrc'
. Этот файл обрабатывается только когда в sshd параметре конфигурации PermitUserEnvironment
установлен на yes
, таким образом, необходимо протестировать самостоятельно, если это работает на Вас, или спросите своего администратора, если это, включают.
– pbm
18.11.2010, 23:46
Когда Вы регистрируетесь на пути ssh, ssh устанавливает переменную $SSH_CONNECTION
. Ваш .bashrc
мог проверить на этот var и если он установлен псевдоним наборов, который Вы хотите:
if [ -n "$SSH_CONNECTION" ]
then
alias vim='vim -u /tmp/myvimrc'
fi