ls
não é um script de shell, se você emitir o comando file
, você saberá que é um arquivo executável ELB de 64 bits LSB:
$ type -a ls
ls is aliased to 'ls --color=auto'
ls is /usr/bin/ls #<---- now we know the file path of 'ls'
ls is /bin/ls
$
$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=ddf8cdb3f1fd2e8263637b7c8ccea84fbf41ee3c, stripped
$
Você pode encontrar o código-fonte online aqui .
Ou, se sua distribuição for distribuições Linux baseadas em RPM + dnf
, você poderá:
$ rpm -qf /usr/bin/ls
coreutils-8.22-22.fc21.x86_64 #so now we know the package name is coreutils
$ sudo dnf whatprovides /usr/bin/ls #alternative way
Using metadata from Mon May 16 02:39:55 2016 (1 day, 23:03:50 hours old)
coreutils-8.22-22.fc21.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo : @System
coreutils-8.22-19.fc21.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo : fedora
coreutils-8.22-22.fc21.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo : updates
$
$ mkdir coreutils #optional
$ cd coreutils #optional
$ sudo dnf download --source coreutils
...
$ rpm2cpio coreutils-8.22-22.fc21.src.rpm |cpio -idmv
...
$ sudo rm coreutils-8.22-22.fc21.src.rpm #optional
$ unp coreutils-8.22.tar.xz
...
$ rm coreutils-8.22.tar.xz #optional
$ cd coreutils-8.22/
$ find . -iname 'ls*'
./lib/lseek.c
./lib/lstat.c
./src/ls.c #<---- now we know ls.c is here
./src/ls-vdir.c
./src/ls.h
./src/ls-ls.c
./src/ls-dir.c
./man/ls.x
./tests/ls
./tests/misc/ls-misc.pl
./tests/misc/ls-time.sh
./m4/ls-mntd-fs.m4
./m4/lstat.m4
./m4/lseek.m4
$ vi ./src/ls.c
Nota:
-
coreutils-8.22-22.fc21.src.rpm é meu, o número do seu pacote pode variar.
-
Alguns comandos como type -a history
return "histórico é um shell embutido", você deve observar o código-fonte atual do shell, ou seja, rpm -qf 'readlink -f /proc/$$/exe'
(Detectar shell atual por comando é tricky do que você imagina, esse truque não funciona em fish
shell)
-
No shell csh / tcsh, você deve usar where history
porque não existe o comando type
. Mais detalhes podem ser encontrados aqui .
-
Você também pode ter interesse em usar curingas, por exemplo repoquery --resolve --archlist=src '*compress*'
para incluir pacotes não instalados (Tenha cuidado se o comando de consulta como '* descompactar *', neste caso você precisa remover o prefixo 'un' para diminuir se a primeira tentativa '* descompactar *' falhar). A saída de repoquery
acima precisa remover o meio 0: e, opcionalmente, o postfix com .rpm para obter o nome completo correto que você pode usar para pesquisar link , por exemplo ncompress-0: 4.2.4.4-3.fc21.src altere para ncompress-4.2.4.4-3.fc21.src.rpm
-
Você pode ativar a depuração de espelho quando a origem de download do dnf, no caso de servidor de espelhamento inativo. Consulte este .
[UPDATE]
Caso você tenha um erro de rpm devido a repositórios inválidos como eu, é assim que eu o consertei:
$ sudo dnf config-manager --set-enabled '*' #Enable all repos, at anytime, check with 'sudo dnf repolist all'
$ repoquery --resolve --archlist=src '*compress*'
Could not match packages: failure: repodata/repomd.xml from rpmfusion-free-rawhide-source: [Errno 256] No more mirrors to try.
http://free.nchc.org.tw/rpmfusion/free/fedora/development/rawhide/source/SRPMS/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
...
$ repoquery --resolve --archlist=src --enablerepo='*source' --disablerepo='rpmfusion-free-rawhide-source' '*compress*' #not works too
...
$ sudo yum-config-manager --save --disablerepo=rpmfusion-nonfree-rawhide-source #for unknown reason, it doesn't work
$ sudo dnf config-manager --set-disabled rpmfusion-free-rawhide-source #for unknown reason, it doesn't work
$ grep -rnIH -D skip --color=always rpmfusion-free-rawhide-source /etc/yum.repos.d/
/etc/yum.repos.d/rpmfusion-free-rawhide.repo:17:[rpmfusion-free-rawhide-source]
$ sudo vi /etc/yum.repos.d/rpmfusion-free-rawhide.repo #Edit rpmfusion-free-rawhide-source from enabled=1 to enabled=0
$ repoquery --resolve --archlist=src '*compress*'#now should works :) repeat the 'grep and vi' steps above if got error in other repos, in my case i have to disable rpmfusion-nonfree-rawhide-source too.
p / s: Edite o título de [rpmfusion-free-rawhide-source]
a [rpmfusion-free-rawhide-source DESATIVA ] hack deve fazer
--enablerepo = '* source' funciona, embora até agora eu ache que é desnecessário porque eu já habilito todos os repos no primeiro comando.