Я хотел бы построить короткую функцию, чтобы сделать следующее. Допустим, я переместил файл file.tex в каталог документов:
mv file.tex ~/Documents
Затем я хотел бы перейти cd
в этот каталог:
cd ~/Documents
Я хотел бы обобщить это для любого каталога, чтобы я мог сделать это:
mv file.tex ~/Documents
follow
и попросите follow
команду прочитать назначение из предыдущей команды, а затем выполнить соответствующим образом. Для простого каталога это не экономит много времени, но при работе с вложенными каталогами было бы здорово иметь возможность просто использовать
mv file.tex ~/Documents/folder1/subfolder1
follow
Я думал, что это будет относительно просто, и что я мог бы сделать что-то вроде этого:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
но это не похоже на работу. Если я повторяю $place
, я получаю желаемую строку (я проверяю ее ~/Documents
), но последняя команда возвращает
No such file or directory
Каталог, безусловно, существует. Я в растерянности. Не могли бы вы помочь мне?
источник
file.tex
в исходном местоположении, символические ссылки являются очень хорошей альтернативой, поскольку вам нужно сделать ссылку только один раз, и тогда она всегда будет указывать на последнюю версию.cd
alt +,.
чтобы заменить последний токен предыдущей команды. Повторите, чтобы вернуться в историю финальных токенов. (Я говорю, что токен не аргумент, потому чтоfoo &
захватывает&
в качестве окончательного токена.) Вы можете использовать числовой аргумент (например, с escape-3 alt +.).Ответы:
Вместо определения функции вы можете использовать переменную
$_
, которая раскрывается до последнего аргумента предыдущей командыbash
. Так что используйте:после
mv
команды.Вы также можете использовать расширение истории:
Если вы должны использовать функцию:
NB. Этот ответ нацелен на точный формат аргументов командной строки, который вы использовали, поскольку мы имеем дело с позиционными параметрами. Для других форматов, например
mv -t foo bar.txt
, вам нужно заранее включить определенные проверки, тогда будет уместна оболочка.источник
cd !$
илиcd $(dirname !$)
. Не знал о$_
переменной!mv -t ~/Documents file.tex
вместоmv file.tex ~/Documents
? В итоге, я не уверен, что это решаемо в общем случае ... функция обертки вокруг или что переопределенияmv
могут быть лучше ...!$
эквивалентно!:$
и быстрее набирать.При стандартных сочетаниях клавиш bash комбинация Alt.скопирует последний аргумент предыдущей командной строки в текущую. Итак, набрав
даст
и будет даже меньше печатать, чем слово
follow
.Для дополнительного удобства повторяем Alt. комбинации будут просматриваться последние аргументы всех предыдущих командных строк.
Приложение: Имя команды bash, соответствующее этой комбинации клавиш, равно
yank-last-arg
илиinsert-last-argument
. Его можно найти на справочной странице bash в разделе «Команды для управления историей» или в более подробном справочном руководстве по Bash .)источник
<esc>
затем,.
чтобы получить тот же результат, что<alt>+.
и этот, полезный, когда вы переназначили capslock, чтобы убежать :)Вы почти наверняка столкнетесь с проблемой, что расширение тильды происходит перед расширением параметра, что можно объяснить кратким примером:
Это можно решить с помощью
eval
. В любом случае, вам это понадобитсяeval
, потому что вы извлекаете команды из истории, и они могут содержать произвольные расширения, например:(Есть проблемы, например, что повторное расширение этих значений может больше не соответствовать исходному расширению, которое имело место. Предположим
compute_folder_name
, это функция, которая увеличивает некоторую глобальную переменную.)источник
eval
. (Когда-либо.) Но хорошее замечание на проблемах последовательности расширения. Если вы упомянете о большей целесообразности расширения истории для использованияeval
здесь, это будет лучшим ответом на мой взгляд; Ни один из других на самом деле не объясняет, почему решение оригинального плаката не сработало.