Как получить предпоследний аргумент из предыдущей команды bash? (в интерактивной оболочке bash)

Как я могу легко получить предпоследнее (предпоследнее) слово / аргумент из предыдущей команды в интерактивной оболочке bash? Я часто запускаю команды в фоновом режиме, и я хотел бы получить файл, который был указан до&например,

  % echo foo > /tmp/foo &
  % cat !$
  % &

В приведенном выше примере!$ дает последнее слово,&, Но я хочу второй до последнего аргумента,/tmp/foo



Обратите внимание, что можно использовать обозначения слов с диапазоном, как!-1:3, но это непрактично для команды с большим количеством слов, где не так быстро очевидно, сколько слов, например,

% (set -x; date; pwd; git status; git diff;  git log | tail -30; date; args=--verbose time make test; date) >& /tmp/log/make.test.20150122-Thu-0834 &
% echo !-1:30
/tmp/log/make.test.20150122-Thu-0834

Приведенный выше пример работает, но вы должны посчитать и знать, что требуемое слово - это 30-е слово, которое отнимает много времени и подвержено ошибкам.

Есть ли простой способ получить второе (предпоследнее) слово?

(Обратите внимание, что этот вопрос относится к аргументам предыдущей команды в интерактивной оболочке, а не к аргументам, передаваемым в сценарий оболочки из командной строки, как здесь упоминаются некоторые ответы и комментарии.)

Ответы на вопрос(2)

Ваш ответ на вопрос