Стойкие аргументы оболочки

Я часто нахожу, что выполняю ряд команд по одному набору аргументов.

Например:

$ nmap -Pn -sS 192.168.1.5 $ ssh 192.168.1.5 $ curl 192.168.1.5 $ wget -r 192.168.1.5 

Это можно ускорить, помещая аргумент (аргументы) в переменную,

 $ a=192.168.1.5 $ nmap -Pn -sS $a $ ssh $a $ curl $a $ wget -r $a 

и ускорялся еще больше, используя несколько функций, таких как следующее.

 $ more .zshrc ... paa() { PERSIST_ARGS+=("$@"); } pa() { eval "$@" "${PERSIST_ARGS[@]}"; } ... $ paa 192.168.1.5 $ pa nmap -Pn -sS $ pa ssh $ pa curl $ pa wget -r 

Есть ли способ ускорить это еще больше? Например,

 $ <start special mode> 192.168.1.5 $ nmap -Pn -sS $ ssh $ curl $ wget -r $ <exit special mode> 

Я ищу решения bash или zsh . Решение должно работать с произвольным набором команд.

  • История команд в Zsh
  • Асинхронный RPROMPT?
  • сбросить счетчик циклов
  • zsh с аргументами
  • Как я могу изменить umask только для одной команды?
  • Завершение Zsh для монтирования (/ run / media / DISK-LABEL)?
  • Как передать переменные среды в новый сеанс входа в ssh?
  • zsh: Повторять каждое утверждение?
  • 3 Solutions collect form web for “Стойкие аргументы оболочки”

    Alt-_ уже вставляет последнее слово из последней команды. Для меня это достаточно хорошо, но вы можете добавить еще одну ключевую привязку, которая вставляет пробел, последнее слово и принимает строку ( Enter ).

    С tcsh или zsh (для Alt-S , S для same ):

     bindkey -s '\es' ' \e_\r' 

    С bash :

     bind '"\es": " \e_\r"' 

    Затем введите:

     $ nmap -Pn -sS 192.168.1.5 $ ssh<Alt-S> $ curl<Alt-S> ... 

    В zsh и tcsh по крайней мере, численный аргумент (то есть, когда вы префикс его Alt- <number> ) будет применен к символу пробела, который не очень полезен ( Alt-3 Alt-S будет вставлять 3 пробела, последний слово один раз и принять строку). Было бы более полезно, если бы он вставлял либо последнее слово из последней команды, либо последнее слово из n- й последней команды, либо последние n слов из последней команды.

    В zsh по крайней мере, вместо использования макроса вы можете определить новый виджет. Например:

     use-last-word() { LBUFFER+=" " zle insert-last-word zle accept-line } zle -N use-last-word bindkey '\es' use-last-word 

    Alt-3 Alt-S вставляет последнее слово из последней команды.

    Чтобы вставить последнее слово из последней последней команды:

     use-last-word() { LBUFFER+=" " local n=$NUMERIC unset NUMERIC repeat ${n:-1} zle insert-last-word zle accept-line } 

    Чтобы вставить последние 3 слова из последней команды:

     use-last-word() { for ((NUMERIC=${NUMERIC:-1}; NUMERIC; NUMERIC--)) { LBUFFER+=" "; zle insert-last-word } zle accept-line } 

    Я чувствую себя плохо, отвечая на мой собственный вопрос, как это, но у меня есть решение:

     pst() { [ $# = 0 ] && return 1 if [ -n $ZSH_VERSION ]; then local read=vared else local read=read fi local cmd local -a args args=("$@") while $read -p '> ' cmd ; do test -z "$cmd" && continue $cmd "${args[@]}" done } 

    Это работает так:

     $ pst 192.168.1.5 > nmap -Pn -sS > ssh > curl > wget -r 

    Я немного оставлю вопрос открытым, чтобы узнать, появляются ли какие-либо превосходные решения. Одним из главных недостатков этого решения является то, что выполняемые им команды не регистрируются.

    Я не реализовал ничего подобного, но мне интересно, можете ли вы задействовать 2 объекта, предлагаемые оболочкой. $ PATH и команда завершены.

    Когда вы находитесь в своем «специальном режиме», вы можете предоставить что-то наподобие вкладки, но вместо того, чтобы многократно нажимать на нее, вы вводите несколько букв фактической команды, которую вы хотите запустить nm (для nmap), и нажмите комбинацию клавиш аналогично табуляции, которая затем допрашивала бы $ PATH, ища исполняемые файлы, которые соответствуют тому, что вы набрали до сих пор, и затем возвращаете список вам так:

    Я печатаю:

     $ pst 192.168.1.5 > nm <press SHIFT-TAB> 

    Мне предлагается следующий список:

     1* - nmap 192.168.1.5 2 - nmap2 192.168.1.5 3 - nmap3 192.168.1.5 

    ПРИМЕЧАНИЕ . Вышеприведенный список будет соответствовать тому, что я набрал после опроса $PATH .

    Из приведенного выше списка я мог либо нажать enter, чтобы принять первый ответ (1 *), либо указать номер совпадения, который я хочу использовать:

     >> 2 <press ENTER> 

    Вы могли бы также интегрировать complete объект в bash и другие оболочки, чтобы сузить совпадения, чтобы в матче учитывались только совпадения, которые могут принимать типы аргументов, предоставляемые pst <arg> .

    Interesting Posts

    OpenBSD X, только мышь прокрутки вниз

    Невосприимчивая память, выделенная для сляба, считающегося используемым или доступным кешем?

    Есть ли инструмент командной строки для управления сигналами unix?

    GPGPU / CUDA в KVM или Xen

    Рекурсивно найти все файлы с именем «file.txt» и выполнить команду sed

    Почему параметр $ 0 дает мне только базовое имя вместо полного пути после преобразования x-shellscript в x-исполняемый?

    Может ли `make` автоматически устанавливать зависимости?

    shell howto: сохранить несколько файлов двоичных данных (jpg) в один файл с некоторыми дополнительными данными и снова отделить

    Как вы защищаете файл текстовых учетных данных с именем пользователя и паролем?

    NAT-T настроен с использованием 3-х линейных машин

    Техника для объединения групп последовательных линий, разделенных по шаблону

    Сценарий резервного копирования Rsync для нескольких серверов

    Как я могу узнать, защищена ли защита паролем, прежде чем подключаться к нему?

    для каждого с массивом с несколькими элементами

    OpenWrt: найдите соседей, зная их MAC-адрес

    Linux и Unix - лучшая ОС в мире.