Que caractere especial pode estar sendo expandido para minha pasta pessoal?

4

Eu estava executando esta linha única para:

for i in 'pwgen -yB -N 8 1'; do echo "$i"; done

Então a saída é:

.
Descargas
Documentos
Escritorio
Imágenes
Música
NetBeansProjects
Plantillas
public_html
Público
Vídeos
.
"
}
"
$
{

Algumas delas, como Descargas , Documentos , Escritorio , pertencem à minha pasta pessoal (em espanhol), onde executo meu ciclo.

O pwgen com argumento -y produz pelo menos um caractere não-alfanumérico especial; -N param é para selecionar o número de senhas geradas (8) e o último 1 é para selecionar o tamanho da senha (1).

Eu estou querendo saber qual caractere especial pode echo $i ser impresso como meu conteúdo inicial.

    
por Camilo Sampedro 05.08.2016 / 22:54

3 respostas

4

Não faça isso:

for i in 'pwgen -yB -N 8 1'

O resultado da substituição do comando está sujeito à expansão do nome do caminho .

Faça isso:

pwgen -yB -N 8 1 | while IFS= read -r i; do printf '%s\n' "$i"; done

Exemplo

Observe que * aparece na saída abaixo, demonstrando que a expansão do nome do caminho não foi executada:

$ pwgen -yB -N 8 1 | while IFS= read -r i; do printf '%s\n' "$i"; done
~
-
*
@
;
\
*
-
    
por 05.08.2016 / 23:34
2

Você está usando 'split' em for i in 'command' .
Mas isso também vem associado a "Geração de Nome de Arquivo" (também conhecido como Expansão de Pathname no bash) no qual caracteres (sem aspas) como * , ? e [ são expandidos para "nomes de arquivos".

Isso pode ser desativado por: set -f .

set -f ; for i in 'pwgen -yB -N 8 1'; do echo "$i"; done

Para usar uma matriz, pode ser uma boa ideia:

$ set -f; arr=( $(pwgen -yB -N 4 1) ); printf '<%s>\n' "${arr[@]}"
<~>
<&>
<_>
<'>

Ou talvez:

$ set -f; arr=( $(pwgen -yB -N 5 18) ); printf '%s\n' "${arr[@]}"
oesheisu%ugh>aetas
nae>chootho|yeiwah
quie{thohp+aechuit
ib\iibugeighe<pie?
kie}phah=ngeitaeph

Claro, você poderia usar readarray para preencher a matriz (não é necessário usar set -f ):

$ readarray -t arr < <(pwgen -yB -N 8 1)

E, em seguida, imprima todos os elementos:

$ printf '%s\n' "${arr[@]}"

Tudo em uma linha:

$ readarray -t arr < <(pwgen -yB -N 4 12); printf '%s\n' "${arr[@]}"
ioquavoej&ee
che>u}phoej<
iuchoo"shoom
hahd!eumohsu
    
por 06.08.2016 / 08:05
1

é * :

for i in 'echo '*''; do echo "$i"; done

Como encontrar:

for i in 'pwgen -yB -N 100 1 | tee /tmp/f1'; do echo "$i"; done >/tmp/f2
diff f1 f2

Você pode precisar executá-lo várias vezes até ver a diferença. Ou aumentar N .

    
por 05.08.2016 / 23:06