2015-01-20 5 views
-1

Я передаю имя файла scp в качестве аргумента, чтобы записать файл с определенным именем.Escaping quotes in bash

Это часть псевдонима в .bash_profile, поэтому я пытаюсь автоматизировать включение текущей даты в имя записываемого файла.

На данный момент у меня есть это:

alias getlog='scp [email protected]:public/censored/current/log/exceptions.log "exceptions_$(date +\"%d_%b_%Y\").log"' 

Давайте сосредоточимся на второй аргумент команды scp. Он записывает имя файла в этом формате:

exceptions_ «20_Jan_2015» .log

Во-первых, котировки включены в название, которое я не хочу. И я также предпочитаю пробелы в имени, а не подчеркиванием, так что это выглядит следующим образом:

исключения 20 Jan 2015.log

Что мне нужно знать о строках и бежать в Баш, чтобы сделай это?

+1

Если вам не нужны кавычки в имени файла, почему вы включили их в формат даты? Одна вещь, которую вам нужно знать об экранировании, заключается в том, что экранированная цитата - это еще один символ. И если вы хотите заменить символы подчеркивания пробелами, просто сделайте это, но либо обратную косую черту - избежите пробелов (так, чтобы они были просто другим символом), либо указали формат с неэксклюзивными кавычками (так что они действительно кавычки). – rici

+1

Для хорошего углубленного обсуждения цитирования оболочки я бы предложил http://mywiki.wooledge.org/Quotes - это много контента, но тогда это большая и важная тема. –

+0

... Передача содержимого через ssh или scp на самом деле сложнее, чем котировка, в общем случае - это влияние безопасности, если что-либо, что предназначено для обработки данных, может интерпретироваться кодом удаленной оболочкой, выполняющей разложения (в scp case) или выполнение команды, заданной в качестве аргумента (в случае ssh). По этой причине всеобъемлющий ответ на этот вопрос сложнее, чем просто исправить вашу непосредственную проблему, не имея в виду, что вы создаете данные для использования с scp. –

ответ

1

Сначала удалите побеги на двойные кавычки в аргументы командной Дейта - они заставляют оболочку рассматривать двойные кавычки как часть строки формата (что означает, что они в конечном итоге заканчиваются в имени файла), а не разделители вокруг строки формата (именно этого вы и хотите). Теперь, когда у вас есть строка с двойным кавычком, просто замените символы подчеркивания пробелами. Сравнит, прежде чем & после вывода команды даты:

$ date +\"%d_%b_%Y\" 
"20_Jan_2015" 
$ date +"%d %b %Y" 
20 Jan 2015 

Вот окончательный псевдоним:

alias getlog='scp [email protected]:public/censored/current/log/exceptions.log "exceptions_$(date +"%d %b %Y").log"' 

Обратите внимание, что двойные кавычки "exceptions_ ... .log" необходимы, чтобы сохранить оболочку от софистики на пробелов в строке даты.

1

Вместо того, чтобы бороться с цитатами и вложенные кавычки намного чище, чтобы использовать функцию BASH вместо из в alias:

getlog() { 
    scp [email protected]:public/censored/current/log/exceptions.log \ 
     exceptions_$(date '+%d_%b_%Y').log 
} 
+1

Это верно и правильно.Это также не совсем общий ответ - отлично подходит для того, что испускает дата, но в случаях, когда происходит более интересная замена переменных, можно вызвать 'printf% q' и более осторожное цитирование. –

+1

Яйцо на моем лице здесь - недостаточно внимательно посмотрел и понял, что только файл _local_ параметризуется, поэтому не задействован удаленный неквалифицированный слой. * Facepalm *. –

+0

Это хорошее * решение *, но оно не отвечает на мой вопрос. Спасибо, в любом случае –