paulo1205
(usa Ubuntu)
Enviado em 04/12/2015 - 02:35h
Linha de comando do shell? Se for, isso é resolvido no nível do próprio shell, em resposta ao uso que você fizer das aspas ou apóstrofos.
Uma quantidade qualquer de espaços ou tabulações que não estejam entre aspas ou apóstrofos nem escapados com uma barra invertida (“
\ ”) conta como um único separador de argumentos (ou como nada, se vierem antes da primeira palavra da linha ou depois da última). Já os espaços escapados com
\ ou cercados por aspas ou apóstrofos são reconhecidos como parte da palavra que constitui um nome de comando ou argumento.
Veja: se você digitar a seguinte linha de comando
meu_programa "Este argumento contém espaços" a \ b\ c 'Este contém uma ( ) tabulação'
o shell eventualmente vai executar algo com efeito semelhante a
char **argv;
argv=malloc(7*sizeof(*argv)); // Porque a linha de comando tem 6 partes
argv[0]="meu_programa";
argv[1]="Este argumento contém espaços"; // 1, 2 e 3 espaços, respectivamente, como na linha de comando
argv[2]="a";
argv[3]=" ";
argv[4]="b c";
argv[5]="Este contém uma (\t) tabulação";
argv[6]=NULL;
execvp("meu_programa", argv);
e isso vai fazer com que o seu programa receba valores correspondentes nos argumentos
argc e
argv da função
main (), fazendo a assertiva abaixo verdadeira.
assert(
argc==6 &&
strcmp(argv[0], "meu_programa")==0 &&
strcmp(argv[1], "Este argumento contém espaços")==0 &&
strcmp(argv[2], "a")==0 &&
strcmp(argv[3], " ")==0 &&
strcmp(argv[4], "b c")==0 &&
strcmp(argv[5], "Este contém uma (\t) tabulação")==0 &&
argv[6]==NULL
);
NOTA: Para conseguir produzir o caráter de tabulação da linha de comando do bash (e eventualmente outros shells interativos), você provavelmente terá de usar Control-V antes de apertar a tecla Tab. O Control-V faz com que o próximo caráter recebido seja tomado literalmente, eventualmente perdendo sua função de caráter de controle.