Je suis vraiment nouveau avec bash, mais c'est l'un des sujets à l'école. L'un des exercices était:
Donnez le numéro de ligne du fichier "/ etc/passwd" où se trouvent les informations sur votre propre connexion.
Supposons que USERNAME
soit mon propre identifiant de connexion, j'ai pu le faire parfaitement de cette façon:
cat /etc/passwd -n | grep USERNAME | cut -f1
Ce qui a simplement donné le numéro de ligne requis (il peut y avoir un moyen plus optimisé). Je me demandais cependant s'il y avait un moyen de rendre la commande plus générale afin qu'elle utilise la sortie de whoami
pour représenter le modèle grep, sans script ni utilisation d'une variable. En d'autres termes, pour conserver une commande d'une ligne facile à lire, comme ceci:
cat /etc/passwd -n | grep (whoami) | cut -f1
Désolé si c'est une question vraiment noob.
cat /etc/passwd -n | grep `whoami` | cut -f1
Le fait d'entourer une commande de `marques lui fait exécuter la commande et envoyer la sortie dans la commande dans laquelle elle est enveloppée.
Vous pouvez le faire avec une seule invocation awk
:
awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd
Plus en détail:
-v
crée une variable awk
appelée me
et la remplit avec votre nom d'utilisateur.-F
définit le séparateur de champ sur :
comme il sied au fichier de mots de passe.$1==me
sélectionne uniquement les lignes dont le premier champ correspond à votre nom d'utilisateur.print
affiche le numéro d'enregistrement (ligne).Vérifiez la substitution de commande dans la page de manuel bash
.
Vous pouvez sauvegarder les tiques ``
Ou $()
, et personnellement je préfère cette dernière.
Donc pour votre question:
grep -n -e $(whoami) /etc/passwd | cut -f1 -d :
remplacera la sortie de whoami
comme argument pour l'indicateur -e
de la commande grep
et la sortie de la commande entière sera le numéro de ligne dans /etc/passwd
de l'utilisateur en cours d'exécution.