Обработка специальных символов ($) в linux и java

Я пытаюсь передать строку в java-программу в качестве аргумента командной строки для некоторой обработки, и она работает нормально, за исключением сценария, в котором переданный аргумент String имеет некоторые специальные символы (например, $). Выполняя СОП, я обнаружил, что сам аргумент был искажен случайными числами вместо специальных символов. Это происходит ТОЛЬКО в Linux и ТОЛЬКО когда аргумент содержит некоторые специальные символы.

$ java -jar testclient.jar  String$$123
String 1 = String31733123

person Spear A1    schedule 17.03.2017    source источник
comment
Цитируйте это. java -jar testclient.jar 'String$$123'   -  person OneCricketeer    schedule 17.03.2017
comment
$$ - это идентификатор процесса. Вам нужно избежать его, если вы не хотите, чтобы оболочка заменяла его числом. например 'String$$123'   -  person Peter Lawrey    schedule 17.03.2017
comment
Это (скорее всего, все) специальные переменные bash: gnu .org / software / bash / manual / html_node / Variable-Index.html - вам нужно избежать их (например, заключив параметры в кавычки)   -  person UnholySheep    schedule 17.03.2017
comment
Но эта проблема возникает и с другими специальными символами, такими как!, $, &, (,), И в Linux. Есть ли что-нибудь, что можно сделать, чтобы гарантировать, что java анализирует эти строковые входы как есть, без использования escape-последовательностей?   -  person Spear A1    schedule 17.03.2017


Ответы (1)


Это происходит ТОЛЬКО в Linux и ТОЛЬКО когда аргумент содержит некоторые специальные символы.

Это потому, что с символом $ «возится» оболочка Linux, а не Java.

$ - это метасимвол оболочки. В частности, он вводит расширение параметра оболочки. В зависимости от того, какие символы следуют за символом $, оболочка заменит его / их чем-то другим. Затем измененные символы используются для аргументов командной строки, передаваемых исполняемому файлу java.

Вы можете найти документацию по расширению параметров shel (для оболочки "bash") здесь:

Обратите внимание, что то же самое произойдет в командной строке Mac OSX и на других диалектах UNIX и Linux.


Если вы хотите, чтобы символ $ передавался как есть, его необходимо заключить в кавычки. Здесь описаны различные способы сделать это:

Фактически, вам, вероятно, следует прочитать все руководство по bash ... или учебник. Это сэкономит вам много времени в долгосрочной перспективе.


Есть ли что-нибудь, что можно сделать, чтобы гарантировать, что java анализирует эти строковые входы как есть, без использования escape-последовательностей?

Нет. «Ущерб» уже нанесен к тому времени, когда Java увидит аргументы командной строки.

person Stephen C    schedule 17.03.2017