Como imprimir novas linhas no final das funções?

2

Se eu digitar echo hello , meu terminal ficará assim:

My-Computer:~ user$ echo hello
hello
My-Computer:~ user$ 

Mas se eu tiver uma função como esta

stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

Parece que isso

My-Computer:~ user$ stringen 18
^\k6JPWVIUdEiudcWSMy-Computer:~ user$ 

Veja que não imprime em uma nova linha? A mesma coisa ao usar printf vs echo . Como posso fazer para que minhas funções criem novas linhas como essa? Eu pensei que o ; iria cuidar disso, mas obviamente não.

Por exemplo, isso retorna o que eu quero

variable=$(stringen 18)
echo $variable

É algo com eco?

    
por DisplayName 04.12.2014 / 23:50

4 respostas

4

Nem cat , tr ou head adicionam um caractere de nova linha ( urandom poderia, mas é aleatório, então eu não confiaria nele). Você precisa inserir manualmente a nova linha, com printf '\n' no final da função ou echo .

BTW, alguns shells adicionam, como zsh , para evitar esse tipo de situação.

    
por 05.12.2014 / 00:08
4

Não importa, no mínimo, se sua função imprime uma nova linha ou não. A substituição de comandos os removerá se houver algum presente.

Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted. (emphasis mine)

testfunc() { echo hello; }    # a newline is printed
output=$(testfunc)            # $output does NOT contain a trailing newline
echo "$output"                # echo adds a newline
printf "%s" "$output"         # no newline
    
por 05.12.2014 / 02:09
0

IMHO, isso pode parcialmente ter a ver com echo , mas há outra parte do problema tomando influência. Então a situação ideal seria se sua distro disponibilizasse uma versão GNU recente de tr (como na minha), porque, como você pode ver abaixo, há uma peculiaridade clara em sua sintaxe e no GNU tr reclama para mostrar onde você tem que aplicar a "correção".

original:

$ stringen() { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

$ stringen 18
tr: range-endpoints of 'a-Z' are in reverse collating sequence order

Ouch! Aqui está uma versão alternativa de sua linha que a corrige (pelo menos na minha distro com GNU tr , ele fez o truque):

"fixo":

$ stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Za-z0-9' | head -c "$1" ; }
$ stringen 18
V068BrYGKIICyLI4QB
$ 

Conclusão: é melhor não misturar conjuntos com tr , mas ao combinar conjuntos / intervalos, sempre certifique-se de manter letras grandes em letras grandes e letras minúsculas em minúsculas.

No entanto : Com um não-GNU tr , o problema com a nova linha ausente ainda pode persistir. Mas com um GNU, minha linha corrigida não fará mais nenhum truque de nova linha.

    
por 05.12.2014 / 00:15
0

Você não precisa de uma variável para salvar a saída para isso. Simplesmente echo da saída diretamente:

echo "$(stringen 18)"

    
por 19.06.2018 / 16:41