предупреждение compgen: опция-C, не работающая, поскольку, я ожидал

Действительное решение этого

switch (fork()) {
    case -1 :
        fprintf (stderr, "fork failed (%s)\n", strerror(errno));
        break;
    case 0 :  // child process comes here
        break;
    default : // parent process
        break;
}

// all continue here
4
03.03.2014, 23:05
1 ответ
[114917] Ссылаясь на страницу руководства по bash:[12165]При использовании опций -F или -C, при использовании опции различные переменные оболочки, задаваемые программируемым завершением Хотя средства и доступны, они не будут иметь полезных значений.[12166]Я предполагаю, что это "неожиданное поведение", на которое оно ссылается. Отсутствие [115313]$COMP_WORDS[115314] и [115315]$COMP_CWORD[115316] в подоболочке, созданной compgen, означает, что ваша начальная "f" не будет передана для фильтрации результатов, следовательно, первые две опции, которые вы видите. Третья "f" -- я займусь этим.[12167] Еще более неожиданно на первый взгляд кажется, что нет никакого способа подавить этот выход (кроме как отвести стдерр от трубопровода) - но на самом деле этому есть разумное объяснение. Аргументы предназначены для использования против команды [115317]complete[115318], с которой [115319]compgen[115320] разделяет код и аргументы, и где они имеют больший смысл.[12168]Команда [115321]complete[115322] используется при регистрации команды завершения, например, [12169]complete -C /tmp/test. sh mycmd[12170] И источник bash [115325][115326] (в [115327] pcompletion[115328], [115329]gen_command_matches()[115330] или thereabouts) объясняет, как ваша "f" попала в результаты:[12171]Третий результат в вашем примере - это, конечно же, обратная передача входной команды в качестве аргумента [115331]$2[115332]. Используя спецификацию завершения, которую мы создали выше, мы можем более ясно показать, как она должна быть использована со скриптом, который аннотирует аргументы:[12172]затем:[12173]Так что это не значит, что [115333]-C[115334] не может быть использована компгеном; просто вы не лучше, чем с [115335]$()[115336].[12174]Я полагаю, что оставшийся вопрос: "почему -C и -F вообще определены против компгена?". Я не знаю. Может быть, проще; а может быть, авторы решили, что (довольно непонятное) предупреждение лучше, чем просто отключить то, что может быть полезным функционалом. Ответ, и, вероятно, правильный поступок на данный момент, это сделать сообщение об ошибке [115337] [115338], запрашивающее разъяснения и/или улучшенную документацию у авторов...[114938].
2
27.01.2020, 21:00

Теги

Похожие вопросы