Простая функция ZSH и файлы с пробелами в имени

Я поместил следующую функцию в свой файл ~/.zshrc:

function note() {
    vim $HOME/Dropbox/$1.md
}

Например, когда я вызываю его с помощью note "20150209-132501-Recx-new note today.md", он создает новый файл, но с именем файла «20150209-132501-Recx-new». Я понимаю, что это простой вопрос, но как заставить его создать заметку с полным именем?


person pdoak    schedule 09.02.2015    source источник
comment
Пока вы указываете имя файла (или, по крайней мере, пробелы) при вызове note, это должно работать. По крайней мере у меня на zsh-5.0.5 работает, возможно на старых версиях (до 5.0) не работает. Вы пытались указать полный путь внутри функции двойными кавычками (vim "$HOME/Dropbox/$1.md")?   -  person Adaephon    schedule 10.02.2015


Ответы (1)


Оболочка выполняет подстановку параметров и разделение слов в этом порядке. Это означает, что вы в конечном итоге выполните

vim /home/username/Dropbox/20150209-132501-Recx-new note today.md.md

т.е. вы вызываете vim с тремя именами файлов. Если вы хотите подавить разделение слов в замещаемой части, вы также должны использовать кавычки в определении функции:

function note() {
    vim "$HOME/Dropbox/$1.md"
}

и назовите его с

note "20150209-132501-Recx-new note today"

EDIT 1: Эта версия note объединяет все аргументы одним пробелом:

function note() {
    filename=$1
    while test $# -gt 1; do shift; filename="$filename $1"; done
    vim "$HOME/Dropbox/$filename.md"
}

EDIT 2: Это может быть еще проще:

function note() {
    vim "$HOME/Dropbox/$*.md"
}
person Jens    schedule 10.02.2015
comment
Я не думаю, что я был ясен. Что я хочу сделать, так это вызвать функцию следующим образом: note 20150209-132501-Recx-new note today и заставить ее выполнить это: vim "20150209-132501-Recx-new note today". Помещение vim "$HOME/Dropbox/$1.md" в функцию не приводит к этому. Фактически кавычки игнорируются - person pdoak; 11.02.2015
comment
@pdoak: это невозможно. Оболочка всегда разбивает слова по пробелам. Вы должны использовать кавычки, если пробелы должны быть частью имени файла. - person Jens; 11.02.2015
comment
Вы имеете в виду, что то, чего я хочу достичь, невозможно или что заключение "$HOME/Dropbox/$1.md" в кавычки не приведет к тому, чего я хочу? Спасибо вам за ваши предложения. - person pdoak; 11.02.2015
comment
@podak Невозможно, чтобы оболочка обрабатывала vim x y z как запущенный vim с одним аргументом x y z. Это может работать с оболочкой DOS, но с оболочкой Unix все по-другому. Пробелы используются для разделения слов. Однако может быть способ объединить аргументы в функции оболочки и обработать результат как одно имя файла. Это то, что вы хотите? - person Jens; 11.02.2015
comment
Звучит так, как будто я этого хочу. Как я могу это сделать? - person pdoak; 11.02.2015
comment
@pdoak Хорошо, смотрите отредактированный ответ. Я думаю, это делает то, что вы хотите :-) - person Jens; 11.02.2015
comment
Спасибо за предложения. Я пробовал оба, но, боюсь, ни один из них не сработал. - person pdoak; 11.02.2015
comment
@pdoak Можно поконкретнее? Как называется созданный файл? Какое ожидаемое имя? Обязательно укажите, какую именно команду вы вводите, с кавычками и всем остальным, если они есть. - person Jens; 11.02.2015
comment
"$HOME/Dropbox/$1.md" работал. Я не перезагрузил .zshrc. Извините за оплошность. Я просто пытаюсь больше использовать терминал и забыл, что мне нужно перезагрузить .zshrc после изменения. Спасибо за помощь. - person pdoak; 12.02.2015
comment
@pdoak Он, забыв указать источник измененного файла - случается с лучшими из нас. Рад помочь! - person Jens; 12.02.2015