Как определить подобную функцию удара сразу

На Linux, gvim == vim -g; это - тот же двоичный файл. Так, если Вы скомпилировали Vim с поддержкой GUI, make install должен установить последовательные версии обоих vim и gvim.

10
29.03.2014, 14:08
3 ответа
[12328]. [12329] Применяются обычные предостережения о [118893] eval[118894].[118232].
9
27.01.2020, 20:00
[117974].
2
27.01.2020, 20:00

Вышеупомянутый источник /dev/fd/3

, который подается в функцию

_gem_dec()

каждый раз, когда он вызывается как предварительно оцененный

  1. здесь-документ. Единственное задание _gem_dec
  2. - получить один параметр и предварительно оценить его как цель пакета
и как имя функции, на которую он нацелен.
  • ПРИМЕЧАНИЕ: . расширения оболочки источника приводят к двойной оценке переменных - точно так же, как и eval. Это может быть рискованно.
  • Однако, в приведенном выше случае, я не думаю, что это может быть рискованно.
  • Если приведенный выше блок кода будет скопирован в

    файл, не только функции оболочки

    _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

    1. выше, чтобы держать

    2. stdin, stdout и stderr, или <&0 >&1 >&2

      • открытыми по привычке - хотя, как и в случае с некоторыми другими мерами предосторожности по умолчанию, которые я здесь реализую - потому что результирующая функция настолько проста, в этом нет необходимости. Но это хорошая практика. Звонок
      • сдвига $#
      • - еще одна из этих ненужных мер предосторожности. Однако, когда файл указан как
    output

    с [118607][119261][необязательное число]file[119264] redirection[118608], ядро считывает его в дескриптор файла, к которым можно получить доступ с помощью

    • -символьного устройства
    • -специальных файлов в

    /dev/fd/[0-9]*[119268]. [118612] Если опустить [118613][119269] [дополнительный номер]

    спецификатор, то для ввода предполагается

    0

    , а для вывода -

    1>file

    . Рассмотрим это:

    И так как

    here-document

    - это только средство для описания файла в строке внутри блока кода, то когда мы это сделаем:

    - мы могли бы сделать:

    - с одним [118621]-очень важным [118622] отличием. Если вы не

    "[\quote'"

    <<"'\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,например:

    Screenshot of “ChromeLite”

    Так что сначала оболочка должна обработать входные данные, что означает чтение:

    В файловый дескриптор 3 и вычисление его для расширения оболочки. Если бы в это время вы запустили:

    или:

    Так как они обе эквивалентны командам, вы бы увидели*:

    Small, USB SD card-reader

    ...прежде чем какой-нибудь код в функции будет выполнен вообще. В конце концов, это все-таки

    SD card with built-in USB interface<вход[119306],[118650]. Дополнительные примеры смотрите в моем ответе на другой вопрос [118651]здесь[118652].

    ( * Технически это не совсем верно. Поскольку я использую ведущую [119307]-dash[119308] перед [119309]here-doc ограничитель[119310], все вышесказанное было бы левым. Но я использовал [119311]-dash[119312], чтобы я мог [119313][119314] для удобочитаемости, так что я не собираюсь снимать [119315][119316] перед тем, как предложить вам прочитать. ...)

    SD card with built-in USB interface

    Самая приятная часть - это кавычки - обратите внимание, что

    Hacked SD card, exposing USB interface

    '"

    кавычки остались, и только

    \

    • кавычки были удалены. Вероятно, именно по этой причине, если вам придется дважды оценивать оболочку
    • $expansion
    • , я порекомендую

    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]. Итак, когда мы запускаем

    _gem_dec()

    , первое, что я делаю, это выбрасываю [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]

    7
    27.01.2020, 20:00

    Теги

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