В чем разница между --param="value" и "--param=value"?

В чем разница между --param="value" и "--param=value"?

В прошлом я читал (не могу вспомнить источник), что:

./script --param="value"

может иметь иные результаты по сравнению с:

./script "--param=value"

и что из-за этих различий (которые могут стать очевидными при переключении систем/ОС/дистрибутивов/оболочек) вы всегда должны делать --param="value". То есть, делать то, что я называю "поздним цитированием" (заключать в кавычки конечную часть или минимальное подмножество; не заключать в кавычки все).

Я также видел, как люди делали это при изменении переменных (например PATH=/bar:"$PATH", по сравнению с PATH="/bar:$PATH"). В общем, я бы сказал, что из того, что я видел, "позднее цитирование" встречается чаще, чем цитирование всего текста.

Мой вопрос: есть ли на самом деле потенциальная разница между --param="value"и "--param=value"? Если мне нужно что-то процитировать, есть ли на самом деле разница между цитированием только части этого и цитированием всего?

Я склонен делать --param="value"это вместо "--param=value", но делаю это в основном потому, что считаю, что так проще мысленно проанализировать, а не потому, что знаю о каких-либо технических различиях.

решение1

Нет никакой разницы, по крайней мере в тех конкретных случаях, которые вы упомянули. Оболочка удалит символы ", и конечный результат будет тем же. Для отладки проблем с цитированием оболочки я иногда использую простую программу, которая просто выводит свой argv. Например,

$ printargs --param="value"
argv[0] = printargs
argv[1] = --param=value

$ printargs "--param=value"
argv[0] = printargs
argv[1] = --param=value

Вот код для справки:

#include <stdio.h>

int main(int argc, char** argv)
{
    int i;
    for (i = 0; i < argc; ++i) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

Связанный контент