Мне интересно, как аргументы, переданные функции в bash
, могут быть правильно «перенаправлены» в другую функцию или программу.
Например, в Mac OS X есть программа командной строкиopen
(справочная страница ), которая откроет указанный файл с помощью приложения по умолчанию (, т. е. откроет *файл.h в Xcode. или папку в Finder и т. д. ). Я хотел бы просто вызвать open
без аргументов, чтобы открыть текущий рабочий каталог в Finder, или предоставить ему типичные аргументы для его нормального использования.
Я подумал: «Я просто воспользуюсь функцией!» Хах, не так быстро там, я полагаю.Вот что у меня получилось.:
function open
{
if [ $# -eq 0 ]; then
/usr/bin/open.
else
/usr/bin/open "$*"
fi
}
Простой вызов open
прекрасно работает, он открывает рабочий каталог в Finder. Вызов open myheader.h
отлично работает, он открывает «myheader.h» в Xcode.
Однако вызов open -a /Applications/TextMate.app myheader.h
для попытки открыть файл в TextMate вместо Xcode приводит к ошибке «Не удается найти приложение с именем '/Applications/TextMate.app myheader.h'». Кажется, что передача "$*"
в /usr/bin/open
приводит к тому, что весь мой список аргументов вместо этого перенаправляется как один аргумент.
Изменение функции на простое использованиеusr/bin/open $*
(без кавычек )вызывает проблемы с путями с пробелами. Вызов open other\ header.h
приводит к ошибке «Файлы /Users/spector -g/other и /Users/spector -g/header.h не существуют», но решает другую проблему.
Должно быть какое-то соглашение для пересылки аргументов, которое я просто упускаю.