Эхо, но сохранить все цитаты - PullRequest
0 голосов
/ 03 ноября 2019

Можно ли повторить текст и сохранить все кавычки и двойные кавычки на месте? Я хочу написать функцию для копирования текста, в настоящее время написанного в терминале (полностью с кавычками).

Так как я на OSX, я должен использовать pbcopy:

pb(){echo "$@" | pbcopy}

Но pb osascript -e 'tell Application "iTerm" to display dialog "Job finished"' возвращает

osascript -e tell Application "iTerm" to display dialog "Job finished" но не

osascript -e tell 'Application "iTerm" to display dialog "Job finished"'.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2019

Оболочка удаляет внешние одинарные кавычки до того, как pb когда-либо увидит аргумент (ы). Передайте single аргумент

pb "osascript -e 'tell Application \"iTerm\" to display dialog \"Job finished\"'"

в pb и определите его как

pb () {
    printf '%s\n' "$1" | pbcopy
}

Вероятно, было бы так же легко использовать здесь документ,однако вместо определения функции, которая передает свой аргумент в pbcopy:

$ pbcopy <<'EOF'
osascript -e 'tell Application "iTerm" to display dialog "Job finished"'
EOF

Чуть больше печатания, но не нужно вкладывать так много кавычек.

1 голос
/ 04 ноября 2019

Можно ли повторить текст и сохранить все кавычки и двойные кавычки на месте? Я хочу написать функцию для копирования текста, в настоящее время написанного в терминале (полностью с кавычками).

Давайте рассмотрим, что вы подразумеваете под «в данный момент написано в терминале». Если я правильно понимаю, вы хотите предоставить произвольный ввод для команды оболочки во время вызова. Другими словами, у вас есть немного текста, который вы хотите добавить в буфер копирования, и вы хотите отправить его на стандартный ввод pbcopy, чтобы сделать это.

В качестве решения этой конкретной проблемы функция оболочки плохо подходит. Это связано с тем, что функцию оболочки необходимо вызывать с аргументами, которые подлежат интерпретации оболочки, и поэтому вам придется тщательно избегать их как при вызове pb, так и при его определении. Эти строки могут быть экранированы. Но это неудобно, во-первых, потому что есть несколько специальных символов, которые должны быть экранированы в строке в двойных кавычках, но ' сам по себе не может быть экранирован в одной строке в кавычках.

Давайте рассмотрим некоторые другие варианты.

$ pbcopy <<< "this is a simple one-line string directly from the command line.  Since it's an argument to pbcopy it needs to be escaped."
$ pbpaste
this is a simple one-line string directly from the command line.  Since it's an argument to pbcopy it needs to be escaped.

Здесь мы говорим оболочке предоставлять текст для стандартного ввода pbpaste. Нам все еще нужно избежать строки. Но нам не нужно никуда его передавать или правильно ставить в кавычки, чтобы сделать его действительным аргументом оболочки.

Или мы можем предоставить многострочные строковые данные для pbcopy без необходимости ставить их в кавычки с помощью этого специальногоСинтаксис here-doc:

$ pbcopy <<-'-my-chosen-delimiter'
> Since this string's delimiter is single quoted,
> no interpolation will occur.  That means " double quotes
> have no meaning, nor does ' single quotes, $dollar signs
> or other such meaningful bash syntaxes.
> -my-chosen-delimiter

$ pbpaste
Since this string's delimiter is single quoted,
no interpolation will occur.  That means " double quotes
have no meaning, nor does ' single quotes, $dollar signs
or other such meaningful bash syntaxes.

Я думал, что bash будет более мощным, чем этот.

Ну, с одной стороны, я думаю, что это очень хорошая возможность сравнить и сопоставить аргументы командной строки (которые по своей природе позиционны и поэтому должны быть проанализированы и разделены, как правило, пробелами междуаргументы) для ввода и вывода потоков, выраженных | конвейерами. Потоки ввода / вывода предназначены для хранения произвольных данных;не ошибка bash в том, что вы захотели включить его в список переменных, анализируемых оболочкой. Это не значительная сила bash, которую вы наблюдаете здесь, это функциональный предел ваших знаний bash.

Но с другой стороны, ты вроде как прав. Уступки к интерактивному интерфейсу командной строки пользователя, существенные исторические ограничения для достижения обратной совместимости и многие действительные конструктивные соображения сделали bash таким, какой он есть. Я, например, нахожу его, и это, безусловно, самый мощный пользовательский интерфейс для компьютера. Но я бы не стал использовать его для сборки сложного приложения, потому что, честно говоря, это синтаксически сложно. Так что не ожидайте, что bash будет чем-то другимЕсли вы не хотите понимать его причудливые и эзотерические неровности, придерживайтесь чего-то более свежего и педантичного, такого как python, go, ruby, node, или чего-либо еще, что не в Unix-ориентированные люди запускают в эти дни: P

...