Избегание двойных кавычек с псевдонимом tcsh - PullRequest
4 голосов
/ 20 декабря 2008

Я пытаюсь запустить следующие команды:

replace -x "must " A2input.txt
replace -x " a" -f -s ## A2input.txt
replace -x to -s ## -a A2input.txt
replace -x faith -f "unequivocal" A2input.txt

И было бы неплохо, если бы я мог просто присвоить этому псевдониму что-то короткое и простое, например "a", "b", "c", "d" и т. Д.

Однако некоторые из этих аргументов имеют кавычки, которые портят псевдоним. Кто-нибудь знает, как на самом деле избежать двойных кавычек? Я пробовал такие вещи, как '\ "' и \", но ничего не работает.

Я использую tcsh в качестве оболочки.

Ответы [ 5 ]

7 голосов
/ 04 марта 2014

Следующие все работы в tcsh для достижения различных результатов:

alias t echo hello world                # you may not actually need any quotes
alias u 'echo "hello world"'            # nested quotes of different types
alias v echo\ \"hello\ world\"          # escape everything
alias w echo '\;'hello'";"' world       # quote/escape problem areas only
alias x 'echo \"hello world\"'          # single quote and escape for literal "
alias y "echo "\""hello world"\"        # unquote, escaped quote, quote ("\"")
alias z 'echo '\''hello world'\'        # same goes for single quotes ('\'')

Чтобы увидеть, как они интерпретируются оболочкой, запустите alias без аргументов:

% alias
t       (echo hello world)
u       echo "hello world"
v       echo "hello world"
w       (echo \;hello";" world)
x       echo \"hello world\"
y       echo "hello world"
z       echo 'hello world'

Все, что в скобках, выполняется в подоболочке. Это было бы плохо, если вы пытаетесь установить переменные окружения, но в большинстве случаев это не имеет значения.

Наконец, вот что на самом деле делают примеры:

% t; u; v; w; x; y; z
hello world
hello world
hello world
;hello; world
"hello world"
hello world
hello world
6 голосов
/ 20 декабря 2008

Я заставил его работать, сохранив строку с двойной кавычкой в ​​переменной, строка которой заключена в одинарные кавычки Когда я использую переменную, я в одиночных кавычках.
Пример:

[11:~] phi% 
[11:~] phi% set text = 'a quote "'
[11:~] phi% alias ec echo '$text'
[11:~] phi% ec
a quote "
[11:~] phi% 
[11:~] phi% alias ec echo this has '$text'
[11:~] phi% ec
this has a quote "
[11:~] phi% 

Я проверял это с tcsh на OSX

2 голосов
/ 18 мая 2016

tcsh имеет более новую переменную backslash_quote. Не уверен, когда он был добавлен, но он поддерживается в 6.18.01 (версия на OS X El Capitan) и 6.19 (последний стабильный выпуск на момент написания). Это позволяет экранировать ', " и ` внутри кавычек.

set backslash_quote

set sentence = 'I\'m a little teapot.'
set sentence2 = "The man said \"hello\""

Если вы не хотите использовать эту опцию, ваш выбор ограничен использованием цитаты другого типа вокруг символа

"The man said "'"'"hello"'"'

или вообще не использовать кавычки, а также свободно отступать.

The\ man\ said\ \"hello\"
0 голосов
/ 25 февраля 2018

Может показаться, что причина того, что \" и \' не работают так, как вы ожидаете, заключается в том, что csh традиционно не поддерживает такой синтаксис, поэтому, если tcsh безоговорочно поддерживает его, такие старые скрипты могут больше не работать должным образом.

Как уже упоминалось в другом ответе, сама tcsh имеет функцию set backslash_quote; однако, в отличие от подразумеваемого в упомянутом ответе, это вряд ли новая функция, она относится только к tcsh и фактически была добавлена ​​к tcsh по крайней мере около 27 лет назад - эта функция впервые была задокументирована в страница справочника по адресу tcsh.man,v 3.8 1991/07/25 04:50:55, которая вряд ли квалифицирует ее как «новую».

http://mdoc.su/n,f,d/tcsh.1

backslash_quote (+)
       If set, backslashes (`\') always quote `\', `'', and `"'.  This
       may  make complex quoting tasks easier, but it can cause syntax
       errors in csh(1) scripts.
0 голосов
/ 20 декабря 2008

Если вы не можете заставить псевдоним работать, просто напишите короткий сценарий оболочки chmod + x и поместите его где-нибудь в $ PATH (например, $ HOME / bin):

#!/bin/tcsh
replace -x "must" ...

У меня нет опыта работы с tcsh, но с bash вы делаете это так:

alias t='echo "hello  world"'     # using single quotes to enclose entire string
alias t=echo\ \"hello\ \ world\"  # escape " and <space>
alias t="echo \"hello  world\""   # double-quote + escape inner double quotes

Может быть, что-то подобное будет работать в tcsh?

...