Использование списка аргументов в bash и zsh в интерактивном режиме


ramok аватар

ramok - Posted on 23 Февраль 2009

Как то был совет "Вставка последнего аргумента предыдущей команды в bash и zsh." который показывает как более эффективно работать в командной строке.
Но он не поможет если вам нужен не один аргумент, а несколько. В этом совете представлен пример работы когда многим командам нужно указывать как параметр имена нескольких файлов.
Для этого используется механизм передачи параметров, который позволяет ссылаться на параметры с помощью переменно $@.

Задача: создать два скрипта, дать им права и добавить их в cvs репозиторий.

ramok@~/ set bin/{wk,kw} # после этой строчки в $@ будет "bin/wk bin/kw"
                                # в $1 = "bin/wk", $2 = "bin/wk"
ramok@~/ vi $@           # аналог vi bin/wk bin/kw
ramok@~/ chmod +x $@     # аналог chmod +x bin/wk bin/kw
ramok@~/ cvs add $@      # аналог cvs add bin/wk bin/kw
cvs add bin/wk bin/kw
cvs add: scheduling file `bin/wk' for addition
cvs add: scheduling file `bin/kw' for addition
cvs add: use `cvs commit' to add these files permanently
ramok@~/ cvs commit -m "add win<->koi scripts" $@
/home/ramok/cvsroot/ramok/bin/wk,v  <--  bin/wk
initial revision: 1.1
/home/ramok/cvsroot/ramok/bin/kw,v  <--  bin/kw
initial revision: 1.1
ramok@~/ $1       #запускаем bin/wk
..

а не проще ли ввести:

$ vi /bin/{wk,kw}
$ chmod +x !* # выведет все аргументы предыдущей команды
$ cvs add !$ #выведет последний аргумент равный /bin/{wk,kw} что бы не зацепить +x
$ cvs commit -m "add win<->koi scripts" !$ #то же самое чтобы не влючать add

Тоже работает как в баше так и в зшелле. Кстати можно и выборочно штучно брать любой аргументи из предыдушей команды !:1 -первый !:2 -второй и так далее

в данном конкретном случае может быть и так
но если перечилять множество файлов, то способ что в совете удобнее

но этот коментарий достоин отдельного совета Ж:-)

И оно работает просто в терминале (не из скрипта)? Шок!!!:-o

Спасибо, коллега, теперь кучу времени сэкономлю :-)