GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible d'appliquer les commandes intégrées à Bash ?

Inspiré par cette question, intitulée :Quand les commandes intégrées sont-elles chargées en mémoire, tout en essayant d'y répondre, j'ai essayé la commande suivante et j'ai été un peu surpris de ne pas pouvoir l'exécuter :

$ strace cd $HOME

Existe-t-il une méthode que je peux utiliser pour exécuter strace pour les commandes intégrées à Bash ?

Réponse acceptée :

Si vous pensez à la façon dont strace fonctionne alors il est tout à fait logique qu'aucun des éléments intégrés à Bash ne soit traçable. strace ne peut tracer que les exécutables réels, alors que les fonctions intégrées ne le sont pas.

Par exemple, mon cd commande :

$ type cd
cd is a function
cd () 
{ 
    builtin cd "[email protected]";
    local result=$?;
    __rvm_project_rvmrc;
    __rvm_after_cd;
    return $result
}

Astuce pour strace'ing cd ?

Je suis tombé sur cette technique où vous pouviez invoquer strace sur le bash réel traiter et, ce faisant, tracer indirectement cd de cette façon.

Exemple

$ stty -echo
$ cat | strace bash > /dev/null

Ce qui me permet de tracer le bash procédez comme suit :

....
getegid()                               = 501
getuid()                                = 500
getgid()                                = 501
access("/bin/bash", X_OK)               = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=940312, ...}) = 0
geteuid()                               = 500
getegid()                               = 501
getuid()                                = 500
getgid()                                = 501
access("/bin/bash", R_OK)               = 0
getpgrp()                               = 32438
rt_sigaction(SIGCHLD, {0x43e360, [], SA_RESTORER, 0x34e7233140}, {SIG_DFL, [], SA_RESTORER, 0x34e7233140}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=62265}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
fcntl(0, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, 

C'est l'invite Bash, où il est assis là, attendant une entrée. Donnons-lui donc la commande cd .. :

read(0, "c", 1)                         = 1
read(0, "d", 1)                         = 1
read(0, " ", 1)                         = 1
read(0, ".", 1)                         = 1
read(0, ".", 1)                         = 1
read(0, "n", 1)                        = 1
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/saml", {st_mode=S_IFDIR|0700, st_size=32768, ...}) = 0
stat("/home/saml/tst", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/saml/tst")                 = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, 

À partir de la sortie ci-dessus, vous pouvez voir où j'ai tapé la commande, cd .. et appuyez sur Entrée, (n ). De là, vous pouvez voir que le stat() fonction a été appelée, et qu'ensuite Bash est assis à un autre read(0.. invite, en attente d'une autre commande.


Linux
  1. Comment utiliser les commandes d'historique de Bash

  2. Commandes Bash bang :une astuce incontournable pour la ligne de commande Linux

  3. La fête ?

  4. Comment afficher la sortie d'un processus en cours d'exécution dans une autre session Bash ?

  5. Comment changer le nombre de commandes stockées dans l'historique de Bash

Qu'est-ce que Git Bash ? Travailler avec les commandes Git Bash

Comment utiliser la commande de lecture Bash

La commande "eval" dans Bash ?

Obtenir des pages de manuel individuelles pour les commandes intégrées Bash ? ?

Exclure certaines commandes du stockage dans l'historique de Bash ?

Réussissez à sauver la journée avec les commandes d'historique de Bash