Que separadores o lexer do bash usa para dividir um comando em palavras?

2

Do manual do bash, sobre a expansão do til:

If a word begins with an unquoted tilde character (‘~’), all of the characters up to the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix .

Eu estava me perguntando por que ~ é reconhecido como prefixo-til em

$ mypath=/program_files:~/home/t
$ echo $mypath
/program_files:/home/t/home/t

Quais palavras são mypath=/program_files:~/home/t divididas pelo léxico de bash? ~/home/t é reconhecido exatamente como uma palavra?

Que separadores de palavras o léxico de bash usa para dividir um comando em palavras? São : e = separadores de palavras? Eles também são palavras?

Obrigado.

Isso é originário porque não consigo entender o link

The tilde inside a PATH string is not understood. This is why the POSIX standard requires to expand tilde sequences after a colon in the command line when a shell macro is assigned.

    
por Tim 07.06.2018 / 22:50

2 respostas

4

Este não é o resultado da divisão de palavras (mais precisamente, divisão de token), é o resultado de expansão do til nas atribuições de variáveis:

Each variable assignment is checked for unquoted tilde-prefixes immediately following a ‘:’ or the first ‘=’. In these cases, tilde expansion is also performed.

Quando ele divide um comando em tokens, a palavra separadores bash usa são seus metacaracteres :

A character that, when unquoted, separates words. A metacharacter is a space, tab, newline, or one of the following characters: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’.

mypath=/program_files:~/home/t

é um único token da perspectiva do bash.

    
por 07.06.2018 / 23:05
2

O til é expandido na atribuição para PATH , porque é uma atribuição variável e o til vem logo após um cólon sem aspas (no seu exemplo).

A "tilde-prefix" consists of an unquoted <tilde> character at the beginning of a word, followed by all of the characters preceding the first unquoted <slash> in the word, or all the characters in the word if there is no <slash>. In an assignment (see XBD Variable Assignment), multiple tilde-prefixes can be used: at the beginning of the word (that is, following the <equals-sign> of the assignment), following any unquoted <colon>, or both.

(de o texto POSIX na expansão do til )

O manual bash coloca como

Each variable assignment is checked for unquoted tilde-prefixes immediately following a : or the first =. In these cases, tilde expansion is also performed. Consequently, one may use filenames with tildes in assignments to PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

Isso significa que atribuir a string não cotada /program_files:~/home/t a PATH expandirá o til interno e que $PATH será a sequência com o til expandido.

Colocar um til literal em PATH , por exemplo, citando a string, fará com que a resolução de nome de caminho dos comandos falhe para esse diretório (a menos que haja um diretório no diretório de trabalho atual com esse nome literal).

bash quando não estiver no modo POSIX, ainda expandirá esses tils em PATH ao procurar por comandos.

Quando o shell varre a linha

mypath=/program_files:~/home/t

é retornado ao analisador como um único token. Ele será processado como um comando simples.

Um comando simples, quando reconhecido como uma atribuição, sofre, entre outras coisas, a expansão do til. Ao fazer a expansão do til no lado direito do = , o shell expandirá o til na string para o diretório inicial do usuário atual, porque ocorre logo após dois pontos.

Veja também o texto POSIX em comandos simples .

    
por 07.06.2018 / 23:25

Tags