J'ai un alias
ensemble pour ma rm
commande. Si j'exécute la alias
commande, c'est ce que j'obtiens en sortie.
alias rm='rm -i'
Maintenant, lorsque j'exécute la rm
commande, cela fonctionne bien comme prévu.
rm ramesh
rm: remove regular empty file `ramesh'? y
Maintenant, j'apprenais sur les appels système qui sont appelés lorsque j'exécute une commande. Pour cela, j'ai pris connaissance de la strace
commande d' ici qui me répertorie les fichiers qui sont appelés lorsque j'exécute une commande. La commande est comme ci-dessous.
strace -ff -e trace=file rm ramesh 2>&1
La commande fonctionne parfaitement bien, sauf qu'elle ignore mes alias que j'ai en place pour ma rm
commande. Il supprime le fichier sans inviter l'utilisateur.
Alors, strace
ignore-t-il des alias comme celui-ci? Si oui, pourquoi en est-il ainsi?
ÉDITER:
Pas sûr, si cela a quelque chose à faire mais type -a rm
me donne la sortie comme,
rm is aliased to `rm -i'
rm is /bin/rm
Envisage-t-il donc /bin/rm
dans ce cas ce qui explique pourquoi l'utilisateur n'est pas invité avant la suppression?
strace
n'ignore pas les alias, car cela impliquerait qu'il y avait quelque chose à ignorer en premier lieu. Un alias est une caractéristique du shell.strace
est un programme différent, et àstrace
l' intérieur du concept d'alias n'existe pas, donc il n'y a rien à ignorer. L'API fournie par le noyau pour l'exécution des programmes n'a pas non plus de concept d'alias, donc il n'y a aucun moyen que le shell puisse dire strace au sujet des alias, même s'il le voulait.strace
un alias, vous devez utiliserstrace
le shell, qui implémente l'alias. Il y a quelques approches que vous pouvez adopter pour faire cela:strace -p $$ &
oustrace bash
oustrace sh -c 'rm ramesh'
(la dernière ignorera également l'alias, mais pour une raison entièrement différente.)Réponses:
strace
ne fonctionne pasrm -i
pour la même raison que:ne sort pas
rm -i
.Les alias sont une fonctionnalité de quelques shells pour permettre à certaines chaînes d'être automatiquement remplacées par une autre lorsqu'elles sont trouvées en position de commande.
Dans:
Les obus élargissent cela pour:
et qui subit une autre série d'interprétations, conduisant dans ce cas à l'exécution de la
whatever
commande.les alias ne sont développés que lorsqu'ils sont trouvés en position de commande (comme premier mot d'une ligne de commande).
zsh
prend en charge les alias mondiaux .Vous pourriez faire:
Mais vous ne voudriez pas, car cela signifierait que:
produirait
rm -i
par exemple.la source
strace
utilise laPATH
variable d'environnement pour localiser le programme à tracer, plutôt que de l'exécuter via le shell (ce qui encombrerait la sortie). Un alias de shell n'est pas un programme, c'est une fonctionnalité du shell et l'strace
ignore donc.Courir
strace strace rm
est plutôt instructif, tout en étant récursif de façon intéressante.la source
Un alias est une fonctionnalité de votre shell. Cependant, strace exécute la commande directement (en utilisant
execve
, probablement), ce qui n'implique pas le shell. (Si strace exécutait la commande donnée via le shell, la sortie de strace contiendrait tous les appels système d'exécution du shell plutôt que seulement ceux du processus d'intérêt.)De plus, lorsque vous exécutez
strace rm ramesh
, le shell interactif n'essaie pas de remplacer votre alias dans les arguments à strace, car cela serait terriblement déroutant pour tout le monde. Le shell ne développe que les alias qui apparaissent en première position sur une ligne de commande.la source
strace utilise
execve c function
commefind command
, Cependant,find uses exec function
vous ne pouvez pas utiliseraliases
,built-in shell command
etc.Tu dois faire:
la source
Pour s'appuyer sur la réponse de Stéphane Chazelas, si vous définissez
(avec un espace à la fin) puis la commande
sera traité comme
Mais même cela ne fonctionnera que pour le premier mot après le
strace
, donc cela ne s'appliquerait pas directement à votre exemple (où vous avez des options intermédiaires). Mais si vous définissezpuis
sera traité comme
la source
Pas d'alias ici
Supposons que nous ayons la définition d'alias
alias rm='rm -i'
dans notre~/.bashrc
. L'alias ajoute l'option d'invite avant de supprimer chaque fichier:Ce n'est pas la faute de
strace
ne pas avoir utilisé l'alias:cela n'a rien à voir avec les alias.
Dans la commande
Les mots
rm
et ne./file
sont que des arguments pour strace pour l'instant - le shell ne peut pas développer l'aliasrm
, car il ne peut pas savoir que strace utilisera ces arguments comme commande plus tard.En général, les alias de commande ne peuvent être utilisés que là où les commandes peuvent l'être.
Les alias sont une fonctionnalité du shell et
strace
n'utilisent pas du tout de shell lorsqu'il appelle la commande à partir de la ligne de commande. Il utilise à laexec()
place, avec les commandes et les arguments de sa propre ligne de commande.À l'intérieur de
strace
, la commande sera appelée avec quelque chose de similaire àexec("rm", "file")
, etexec()
trouvera/bin/rm
dans PATH - sans utiliser de shell.Shell explicite
Maintenant, pourquoi ne pas inclure un shell dans la
strace
commande?Hmm ... ça n'a pas marché.
rm
vient de supprimer le fichier, sans l'-i
invite.Alias interactifs
Les alias ne sont normalement activés que dans des shells interactifs, des lignes de commande réelles dans un terminal.
Avec notre exemple d'alias, il est facile de comprendre pourquoi cela a du sens: si l'
rm -i
alias était développé à l'intérieur de scripts shell, il se bloquerait au premierrm
avec personne là-bas pour appuyery
.Les alias sont contrôlés par l'option shell
expand_aliases
. Nous pourrions définir l'option avecbash +O expand_aliases -c ...
. Mais cela ne suffit pas, car le shell non interactif ne lira pas non plus~/.bashrc
. Cela signifie que notre alias est non seulement désactivé par l'option, mais également pas défini.Faire semblant d'être interactif
La manière simple de gérer les deux parties consiste à utiliser l'option de ligne de commande
-i
pour faire en sorte que le shell prétende qu'il est interactif:Enfin, l'
-i
alias a été utilisé!Notez que vous n'utiliseriez pas normalement des shells fonctionnant avec l'
-i
option de script, même si vous souhaitez avoir vos alias disponibles, par exemple.la source