Hoje notei que algo mudou no Perl, provavelmente recentemente, na forma como ele executa comandos shell. Alguém poderia explicar o que mudou? Não consigo encontrar a resposta sozinho e, infelizmente, aprendemos sobre essa mudança da maneira mais difícil possível. Alguns novos usuários obtiveram conteúdos interessantes de seus novos diretórios pessoais...
Estou executando um comando/script simples:
#!/usr/bin/perl -w
system("ls -R /etc/skel/.[^.]*");
No Debian 11: perl v5.32.1
, a saída é apenas o conteúdo de /etc/skel
(como esperado):
. .. .bash_logout .bashrc .face .face.icon .kshrc .profile
Mas no Debian 12: perl v5.36.0
o globbing ^
é ignorado e o todo /etc
é lido, o que significa ..
que não é ignorado .
Quando mudo ^
para o símbolo alternativo !
: system("ls -R /etc/skel/.[!.]*");
, ele funciona conforme o esperado novamente.
A questão é: o que mudou no Perl no tratamento de símbolos !
e ^
na system()
invocação?
EDITAR: 29.09.2023, 19h50
Fiz alguns testes nos dois servidores e parece que algo mudou dash
?
Debian 11: dash Version: 0.5.11+git20200708+dd9ef66-5
(não vejo uma --version
bandeira no traço, então é do APT).
root@s:~# dash -c 'ls -R /etc/skel/.[^.]*'
/etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.forward+spam /etc/skel/.kshrc /etc/skel/.profile
root@s:~# dash -c 'ls -R /etc/skel/.[!.]*'
/etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.forward+spam /etc/skel/.kshrc /etc/skel/.profile
Debian 12:dash Version: 0.5.12-2
[students] ~ ➽ $ dash -c 'ls -R /etc/skel/.[^.]*' | more
/etc/skel/..:
a2ps.cfg
a2ps-site.cfg
adduser.conf
adjtime
aliases
aliases.db
alsa
alternatives
[students] ~ ➽ $ dash -c 'ls -R /etc/skel/.[!.]*'
/etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.face /etc/skel/.face.icon /etc/skel/.kshrc /etc/skel/.profile
Atenciosamente, Kamil