2010-11-11 3 views
1

Я искал некоторый код ksh и наткнулся на строку, которую я не думал, будет работать. После тестирования кода он работал, но я не уверен, почему.Обратная косая черта в Kornshell

Если это имеет значение, это работает на системе AIX 5.3.

линия в коде было:

scriptname=$(\basename $0) 

Я не думаю, что это будет работать из-за обратной косой черты перед командой basename, но когда я проверил переменную scriptname, это было правильно стоимость.

Я сделал некоторые дальнейшие испытания в командной строке:

$ echo $(\echo test) 
test 
$ echo $(\echo \test) 
test 
$ echo $(\e\c\h\o \test) 
test 
$ echo `\e\c\h\o \test` 
test 
$ echo $(\echo "\test") 
est 

Я попробовал его вне команды subtitution, и она по-прежнему не работает, как я думал, что это будет:

$ \echo \testi\ng 
testing 
$ \echo "\testi\ng" 
     esti 
g 

Последний - единственный, который имеет для меня какой-то смысл.

Разве Kornshell просто игнорирует обратную косую черту или может просто преобразовать их в символ перед обратной косой чертой? Я предположил, что размещение \n в любой точке командной строки будет символом новой строки, но, видимо, только в кавычках, или \\n.

Может кто-нибудь объяснить, что делает ksh с обратной косой чертой в командной строке?

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

scriptname=$(basename $0) 

вместо:

scriptname=$(\basename $0) 

ли это значение?

Заранее благодарен!

ответ

3

Если какая-либо часть имени команды цитируется, тогда ksh игнорирует любые псевдонимы при выборе того, что нужно выполнить.

Я полагаю, поэтому исходный скрипт использовал \ basename.

+0

Интересно. Есть ли недостатки обратной косой черты, кроме как выглядит странно? – BrianH

+0

Ничего, о чем я знаю, кроме смущения незнакомых им людей. – Darron

1

Я столкнулся с родственной, но немного другой ситуацией. Я редактирую скрипт с несколькими погонных командами написанных как:

\rm ... 

мне было интересно, почему «\» была до ете и аналогичным образом пытался его только найти, что это не похоже на работу. В соответствии с этим site это делается для предотвращения случайного использования сценария с помощью псевдонима (например, если rm псевдониму присвоено значение «rm -i»). Так как я сначала нашел дискуссию о переполнении стека, я подумал, что добавлю этот бит на случай, если он поможет другому человеку.