Как правильно «пересылать» аргументы функций в bash?

Мне интересно, как аргументы, переданные функции в 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 не существуют», но решает другую проблему.

Должно быть какое-то соглашение для пересылки аргументов, которое я просто упускаю.

7
задан inspector-g 20 April 2012 в 01:28
поделиться