Можно ли повторить текст и сохранить все кавычки и двойные кавычки на месте? Я хочу написать функцию для копирования текста, в настоящее время написанного в терминале (полностью с кавычками).
Давайте рассмотрим, что вы подразумеваете под «в данный момент написано в терминале». Если я правильно понимаю, вы хотите предоставить произвольный ввод для команды оболочки во время вызова. Другими словами, у вас есть немного текста, который вы хотите добавить в буфер копирования, и вы хотите отправить его на стандартный ввод 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