Shell: Как я получаю последний аргумент предыдущая команда, когда это было отсоединено?

Нет никакой потребности вообще, чтобы Вы использовали оболочку по умолчанию для данной системы. И Debian и FreeBSD обеспечивают много различных оболочек и большинство, или все они являются доступными на обоих, или предварительно установленных или легко устанавливаемыми.

Не упустите именование. Это весьма характерно для /bin/csh действительно быть tcsh, или для /bin/sh быть ударом или ksh.

sh, Оболочка Bourne, самая старая оболочка Unix, это все еще широко используется. bash вероятно, наиболее широко используемая sh производная; ksh и zsh также широко распространены.

csh, оболочка C, был разработан для BSD Bill Joy. Это имеет некоторые функции, которые делают для более удобного интерактивного использования, чем sh (или по крайней мере, чем старая версия sh это существовало в то время). tcsh получен из csh, и добавляет много новых опций, большинство из них нацеленный на интерактивное использование. Как Вы видели путем чтения csh.whynot, csh, и tcsh имеют некоторые проблемы когда дело доходит до использования их для сценариев в противоположность в интерактивном режиме.

Лично, я запустил с csh, затем переключенного на tcsh, когда это стало доступным. Я теперь редко использую csh для сценариев, предпочитая sh или удара (или Perl для чего-либо довольно сложного).

(Обновление, несколько лет спустя: я с тех пор отказался от tcsh, и я теперь использую удар в интерактивном режиме.)

Мой совет состоял бы в том, чтобы выбрать единственную оболочку и изучить это хорошо, с помощью него и на FreeBSD и на Debian. Если Вы выбираете tcsh, я думаю, что необходимо будет установить его на Debian: sudo apt-get install tcsh. Если Вы выбираете удар, я не знаю, предварительно установлен ли он на FreeBSD; если это не, это должно быть одинаково просто для установки его.

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

ksh, вероятно, почти так же мощен как удар, и zsh еще более мощен (и имеет много функций, которые я никогда не не торопился для изучения).

Я предлагаю удар, и для FreeBSD и для Debian (и для любых других подобных Unix систем Вы могли бы использовать), и и для интерактивного использования и для сценариев. Но другой выбор совершенно законен, и некоторые могли бы подойти Вам лучше.

3
17.06.2013, 02:53
4 ответа

\e-\e. (или нажатие - и . при содержании высокого звука/опции), вставляет предпоследнее слово.

Точно так же \e-2\e. вставляет третье последнее слово, и \e2\e. вставляет третье слово.

3
27.01.2020, 21:10

Используя расширение истории, можно получить доступ к словам предыдущей команды с !:n где n запускается в 0 с названия команды. !^ эквивалентно !:1. В этом случае Вы хотите !:2

$ echo foo bar &
[1] 10750
foo bar
$ echo !:2
echo bar
bar
[1]+  Done                    echo foo bar
3
27.01.2020, 21:10
  • 1
    Механизм истории Csh не заменяет аргумент на командной строке Bash, все же. –  tripleee 17.06.2013, 11:19
  • 2
    Правда, это - заполнитель только. –  glenn jackman 17.06.2013, 14:02

Ответы glenn и Lauri корректны, но они требуют слишком большого ввода IMO. Наконец я предложил следующее решение: C-j цикличное выполнение через аргументы предыдущей команды (исключая амперсанд), от последнего до первого. Это очень практично! Вот то, как сделать это:

Запишите следующий сценарий удара:

#!/bin/bash

cj_hist=$(builtin history | tail -n1)
cj_num=$(cut -f1 -d\  <<< $cj_hist)

if [[ $cj_old_num -eq $cj_num ]]
then
  cj_killw='\x17'
else
  cj_args=$(cut -f3- -d\  <<< $cj_hist)
  cj_args=${cj_args%&}
  cj_args=($cj_args)
  cj_cnt=0
  cj_killw=''
fi

[[ $cj_cnt -le 0 ]] && cj_cnt=${#cj_args[*]}
let cj_cnt--

if [[ $cj_cnt -eq -1 ]]
then
  bind '"\ez":""'
  # bind -m vi-insert '"\C-o":""'
else
  bind '"\ez":"'$cj_killw${cj_args[$cj_cnt]}'"'
  # bind -m vi-insert '"\C-o":"'$cj_killw${cj_args[$cj_cnt]}'"'
fi

cj_old_num=$cj_num

Поместите это в свой ~/.bashrc:

 bind -x '"\ew": source ~/foo.sh'  # ~/foo.sh is the script's path
 bind '"\C-j":"\ew\ez"'
 # bind -x '"\C-h": source ~/foo.sh'      # vi-users: no mess
 # bind -m vi-insert '"\C-j":"\C-h\C-o"'  # with escapes

NB: Так как мы получаем сценарий, мы должны использовать имена переменной, которые не являются наиболее часто используемыми, следовательно префикс cj_. Конечно, можно использовать другой префикс.

1
27.01.2020, 21:10
  • 1
    Это заставляет меня хихикать, когда 3 символа очень вводят. Как только предыдущая команда имеет больше чем 3 аргумента, я побеждаю!!! 1! :) –  glenn jackman 17.06.2013, 14:03
  • 2
    C-j C-j C-j C-j может быть быстрее для ввода, чем :!5 хотя, и я не должен считать аргументы. Вы знаете, я делаю глупые вещи ввести меньше символов или дать моему мозгу отдых, такой как: alias l=ls :-) Лень является самым большим фактором прогресса. –  BertS 17.06.2013, 15:13
  • 3
    свои локальные переменные local ограничить объем; и так как Вы получаете его, отбрасываете #! строка. –  Rich 07.10.2017, 00:52

Вы делаете $_.

echo 'hey there' &
echo "$_"

OUTPUT

hey there
hey there
2
27.01.2020, 21:10

Теги

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