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

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

Например:

$ 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
  • Как управлять mysql с помощью zpty?
  • Обновление zsh на красной шляпе 5 x86_64
  • Почему замена процесса <() не работает с ssh -F
  • Можно ли включить файл в конфигурационный файл zsh? Как?
  • Выключить и перезапустить контрольный код?
  • Использование вложенного тройного выражения в командной строке .zshrc
  • Что есть? "^ [B" backward-word "При попытке настроить 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

    Дифференцирование между запуском и получением источника в сценарии оболочки bash?

    Использование балансировки нагрузки вместо Apache для дросселирования транзакций с определенных IP-адресов

    Найти все каталоги, в которых у пользователя есть доступ к поиску и эхо из этих каталогов в оболочке

    Почему время bash точнее, чем время GNU?

    Почему принудительно fsck при включении Sheevaplug?

    Как выйти из пейджера GRUB2 раньше?

    Права Linux на смонтированные акции

    Emacs: интерфейс, который смешивает команды и аргументы

    стример не записывает аудио

    Почему происходит сбой подключения к локальной сети на мой общедоступный IP-адрес?

    Список репозиториев из частного реестра докеров

    Важным является порядок блоков в / etc / network / interfaces? если да, то почему?

    обрабатывать непрерывный вывод synclient

    Удалите строки между двумя тегами (с некоторыми ограничениями)

    Как найти беглого Кронтаба

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