Обратная косая черта в Корншелле - PullRequest
1 голос
/ 11 ноября 2010

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

Если это имеет значение, он работает в системе 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

Я попытался выполнить его за пределами подстановки команд, и он все еще не работал так, как я думал:

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

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

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

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

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

scriptname=$(basename $0)

вместо:

scriptname=$(\basename $0)

Это имеет значение?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

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

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

1 голос
/ 31 марта 2011

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

\rm ...

Мне было интересно, почему '\' был до rm, и аналогичным образом попробовал его, только чтобы обнаружить, что оно, кажется, работает. Для этого сайта это сделано для предотвращения случайного использования сценарием псевдонима (например, если для rm указан псевдоним 'rm -i'). Поскольку я сначала нашел обсуждение вопроса переполнения стека, я подумал, что добавлю этот бит, если он поможет следующему человеку.

...