На Linux, gvim
== vim -g
; это - тот же двоичный файл. Так, если Вы скомпилировали Vim с поддержкой GUI, make install
должен установить последовательные версии обоих vim
и gvim
.
Вышеупомянутый источник /dev/fd/3
, который подается в функцию
_gem_dec()
каждый раз, когда он вызывается как предварительно оцененный
Если приведенный выше блок кода будет скопирован в
файл, не только функции оболочки_guard(), _rspec()[119242] и [119243]_rake()
будут объявлены при входе в систему, но и функция
_gem_dec()
$ ln -s ~/dotfiles/bashrc ~/.bashrc
также будет доступна для выполнения в любое время в командной строке оболочки [118593](или иным образом)[118594] и поэтому
новые шаблонные функции могут быть объявлены в любое время с помощью простого метода:
И спасибо @Andrew за то, что показал мне, что их не съест
для цикла.
$ grep /dev/pts /proc/mounts
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620 0 0
НО КАК?
# mount devpts /dev/pts -t devpts -o mode=620
Я использую файловый дескриптор
rar x $file $folder\ -y av-
3
выше, чтобы держать
stdin, stdout и stderr, или <&0 >&1 >&2
с [118607][119261][необязательное число]
/dev/fd/[0-9]*[119268]. [118612] Если опустить [118613][119269] [дополнительный номер]
спецификатор, то для ввода предполагается
0 , а для вывода - 1>file . Рассмотрим это: И так как here-document - это только средство для описания файла в строке внутри блока кода, то когда мы это сделаем: - мы могли бы сделать: - с одним [118621]-очень важным [118622] отличием. Если вы не
<<"'\LIMITER"
из
here-document
, то оболочка будет оценивать его для shell'а
$expansion
like:
Итак, для
_gem_dec()[119286],[118632]
3<<-FUNC here-document
оценивается как файл на входе, как если бы он был
3<~/some. file
за исключением
того, что из-за того, что мы оставляем
FUNC[119294] ограничитель[118638] свободным от кавычек, он сначала вычисляется для
$расширения.Важно то, что он является входным, то есть существует только для
_gem_dec(),
, но он также вычисляется до запуска функции _gem_dec() , так как наша оболочка должна прочитать и вычислить его $расширения[119302], прежде чем[118646] выдаст его как входное значение. Давайте сделаем guard,например:
Так что сначала оболочка должна обработать входные данные, что означает чтение:В файловый дескриптор 3 и вычисление его для расширения оболочки. Если бы в это время вы запустили:
или:
Так как они обе эквивалентны командам, вы бы увидели*:
...прежде чем какой-нибудь код в функции будет выполнен вообще. В конце концов, это все-таки
<вход[119306],[118650]. Дополнительные примеры смотрите в моем ответе на другой вопрос [118651]здесь[118652].
( * Технически это не совсем верно. Поскольку я использую ведущую [119307]-dash[119308] перед [119309]here-doc ограничитель[119310], все вышесказанное было бы левым. Но я использовал [119311]-dash[119312], чтобы я мог [119313]
Самая приятная часть - это кавычки - обратите внимание, что
'"кавычки остались, и только
\
here-document
, потому что котировки [118663] намного [118664] проще, чем
Во всяком случае, приведенный выше код теперь точно такой же, как и файл, переданный в видеeval[119326].
3<~/heredoc. file
просто ждет, когда функция
_gem_dec()
#!/bin/bash
for i in {2..70}
do
echo Doing track number $i...
./HandBrakeCLI -t $i -i /Volumes/MX1-0N-NW1_DES --preset iPad -o X-Men_Vol1_Disk1_Title$i.mp4
done
начнет работать и примет ее вход на
/dev/fd/3[119332]. Итак, когда мы запускаем
, первое, что я делаю, это выбрасываю [118675] все [118676] позиционные параметры, потому что наш следующий шаг - это дважды оцененное расширение оболочки, и я не хочу, чтобы любое из содержащихся в нем
$расширений
интерпретировалось как любой из моих текущих
$1 $2 $3...
параметров. Поэтому я:
$ pkgfile --search rc-local.service
community/initscripts-systemd
сдвиг
отбрасывает столькопозиционных параметров
which (1) - shows the full path of (shell) commands
whereis (1) - locate the binary, source, and manual page files for a command
, сколько вы укажете, и начинаю с
$1[12136]с того, что осталось. Таким образом, если бы я вызвал [12137]_gem_dec одну две тройку [12138] при запросе [12139]_gem_dec с $1 $2 $3 [12140] позиционных параметров был бы [12141]один два три [12142] и общий текущий счетчик позиций, или [12143]$#[12144]был бы 3. Если бы я тогда назвал [12145]сдвиг 2, [12146] значения [12147]1 [119356] и [119357]2 [12148] были бы [12149]сдвиг [119360]ed [118700], то значение [12150]1 [12151] изменилось бы на [12152]3 [12153], а [12154]$# [12155] расширилось бы до [118707]1. Таким образом, [12156]$#[12157] просто выбрасывает их все. Делать это строго осторожно и это просто привычка, которую я выработал после такого рода вещей на некоторое время.
Вот оно в [12158](subhell)[12159] немного раскладывается для ясности:[12160] В любом случае, следующий шаг - это место, где происходит волшебство. Если вы [12161]. ~/some.sh[12162]в командной строке оболочки, то все функции и переменные окружения, объявленные в [12163]~/some.sh[12164]будут вызываться в командной строке оболочки. То же самое верно и здесь, за исключением нас [12165]. source[12166]- специального файла [12167]-символьного устройства[12168] для нашего дескриптора файла, или [12169]. /dev/fd/3[12170]- в котором был исправлен наш строчный файл [12171]here-document[12172]- и мы объявили нашу функцию. И вот как это работает.[12173]- теперь делает все, что должна делать ваша [12174]_guard[12175]функция.[12176]Добавление:[12177]- отличный способ сказать сохранить ваши позиции:[12178]EDIT:[12179] Когда я впервые ответил на этот вопрос, я сосредоточился больше на проблеме объявления оболочки [12180]function()[12181] способной объявить другие функции, которые сохранялись бы в текущей оболочке [12182]$ENV[119388]ironment[118730], чем на том, что бы делал запрашивающая сторона с указанными постоянными функциями. С тех пор я понял, что моё изначально предложенное решение, в котором [12183]3<<-FUNC[12184]] приняло форму: [12185]Скорее всего, это не сработало бы так, как ожидалось для запрашивающего, потому что я специально изменил название декларативной функции с [12186]$1[12187]на [12188]_${1}[12189], что, если бы она была вызвана, например, как [12190]_gem_dec guard[12191], привело бы к тому, что [12192]_gem_dec[12193] объявил бы функцию с именем [12194]_guard[12195], в отличие от простого [12196]guard[119402]. Примечание:[12198]Такое поведение является для меня привычным - обычно я оперирую презумпцией, что функции оболочки должны занимать [118747]только [118748] свое собственное [12199]_пространство имен[12200], чтобы избежать их вторжения в [12201]пространство имен[12202]собственно команд оболочки [12203]. Однако это не является универсальной привычкой, о чем свидетельствует использование запрашивающей стороной команды [12206] [12207] для вызова [12208]1[119414]. Дальнейшее изучение заставляет меня поверить в следующее: [12210] запрашивающая сторона хочет, чтобы функции оболочки с именами [12211] guard, rspec или rake[12212], которые при вызове, заново скомпилируют одноименную функцию [12213] ruby[12214] [12215], если [12216] файл [12217] Gemfile[12218] существует в [12219] $PATH[12220] Или [12221], если Gemfile[12222] не существует, то функция оболочки должна выполнить одноименную функцию [12223] ruby[12224]-а. [12225] Это не сработало бы ранее, поскольку я также изменил [12226]$1[12227], вызванный командой [12228] [12229], чтобы прочитать:[12230], что не привело бы к выполнению функции [12231]ruby[12232], которой является функция оболочки, скомпилированная как: [12233] Надеюсь, вы видите [118767] (как в конечном итоге и видел) [118768], что запрашивающая сторона использует команду [12234][12235] только для косвенного указания пространства имен [12236][12237], потому что команда [12238][12239] предпочтет вызвать исполняемый файл в [12240]$PATH[12241], а не одноименную функцию оболочки. [12242]Если мой анализ верен [118777] (как я надеюсь, что запрос подтвердит)[118778], то это: [12243] Должна лучше удовлетворять этим условиям, за исключением того, что вызов [12244] guard[12245] в запросе будет [118781] только [118782] пытаться выполнить исполняемый файл в [12246]$PATH[12247] под именем [12248] guard[12249], в то время как вызов [12250]_guard[12251] в запросе проверит существование [12252] Gemfile[12253] и скомпилирует соответствующим образом [118791] или [118792] выполнит исполняемый файл [12254] guard[12255] в [12256]$PATH[119456]. Таким образом [12257] пространство имен [12258] защищено и, по крайней мере, как я его понимаю, намерение запрашивающего все еще выполняется. На самом деле, если предположить, что наша функция оболочки [12260]_${1}()[12261] и исполняемая [12262]${PATH}/${1}[12263] являются [118803] единственными [118804] двумя способами, которыми наша оболочка может интерпретировать вызов либо [12264]$1[12265], либо [12266]_${1}[12267], то использование команды [12268]$[12269] в этой функции теперь вообще делается полностью избыточным. Тем не менее, я позволил ей остаться, так как не люблю повторять одну и ту же ошибку дважды... подряд в любом случае.[12270]Если это неприемлемо для запрашивающего и он/она предпочел бы полностью отказаться от [12271]_[12272]тогда, в его нынешнем виде, редактирование [12273]_underscore[12274]out должно быть всем, что нужно сделать запрашивающему, чтобы удовлетворить его/ее требования, как я их понимаю. [12275]Помимо этого изменения я также отредактировал функцию, чтобы использовать [12276]&&[119474] и/или [119475]||[12277]shell [118817]short-circuit[118818] conditionals, а не исходный [12278]if/then[12279]syntax. Таким образом, утверждение [12280] команды [12281] оценивается только в [118823], если [12282] Gemfile[12283] не находится в [12284] $PATH[119484].[118828] Эта модификация требует добавления [12285] возврата $? [12286], однако, чтобы гарантировать, что утверждение [12287] пакета [12288] не будет запущено в случае, если [12289]Gemfile[12290] не существует, но функция [12291]ruby $1[12292] возвращает что-либо, кроме [118837]0. [12293]Наконец, я должен отметить, что это решение реализует только конструкции портативных оболочек. Другими словами, это должно давать идентичные результаты в любой оболочке, претендующей на совместимость с POSIX. Хотя утверждать, что каждая POSIX-совместимая система должна обрабатывать директиву [12294]ruy bundle[12295], конечно, было бы глупо, но, по крайней мере, императивы оболочки, вызывающей оболочку, должны вести себя одинаково независимо от того, является ли вызывающая оболочка [12296]sh[119496] или [119497]dash[119498]. [118842] Также вышеизложенное будет работать, как и ожидалось [118843] (предполагая, по крайней мере, наполовину разумный [119499] shopts[119500] в любом случае) [118844] в обеих директивах [12297]bash[119502] и [119503]zsh[119504]. [12298]