GNU/Linux >> Tutoriels Linux >  >> Linux

10 utilisations étonnantes et mystérieuses du symbole (!) ou de l'opérateur dans les commandes Linux

Le '!' le symbole ou l'opérateur sous Linux peut être utilisé comme négation logique opérateur ainsi que pour récupérer les commandes de l'historique avec des ajustements ou pour exécuter la commande précédemment exécutée avec modification. Toutes les commandes ci-dessous ont été vérifiées explicitement dans bash Shell. Bien que je n'aie pas vérifié, mais la plupart d'entre eux ne fonctionneront pas dans un autre shell. Nous entrons ici dans les utilisations étonnantes et mystérieuses de '!' symbole ou opérateur dans les commandes Linux.

1. Exécutez une commande à partir de l'historique par numéro de commande.

Vous ne savez peut-être pas que vous pouvez exécuter une commande à partir de votre historique commande (commandes déjà/précédemment exécutées). Pour commencer, recherchez d'abord le numéro de commande en exécutant 'history ‘ commande.

$ history

Exécutez maintenant une commande à partir de l'historique juste par le numéro auquel il apparaît, dans la sortie de l'historique . Dites exécuter une commande qui apparaît au numéro 1551 dans la sortie de 'historique ‘ commande.

$ !1551

Et, il exécute la commande (commande supérieure dans le cas ci-dessus), qui a été répertoriée au numéro 1551 . Cette façon de récupérer une commande déjà exécutée est très utile, en particulier dans le cas de ces commandes longues. Il vous suffit de l'appeler en utilisant  ![Numéro auquel il apparaît dans la sortie de la commande d'historique] .

2. Exécutez la commande précédemment exécutée en tant qu'avant-dernière commande, 7e dernière commande, etc.

Vous pouvez exécuter les commandes que vous avez exécutées précédemment par leur séquence d'exécution, la dernière commande exécutée sera représentée par -1 , avant-dernier comme -2 , septième dernier comme -7 ,….

Historique de la première exécution commande pour obtenir une liste de la dernière commande exécutée. Il est nécessaire d'exécuter l'historique commande, afin que vous puissiez être sûr qu'il n'y a pas de commande comme rm command > file et d'autres juste pour s'assurer que vous n'exécutez pas accidentellement une commande dangereuse. Et puis cochez Sixième dernière commande, Huitième dernière commande et Dixième dernière commande.

$ history
$ !-6
$ !-8
$ !-10
3. Passez les arguments de la dernière commande que nous exécutons à la nouvelle commande sans retaper

J'ai besoin de lister le contenu du répertoire '/home/$USER/Binary/firefox ‘ alors j'ai tiré.

$ ls /home/$USER/Binary/firefox

Puis j'ai réalisé que j'aurais dû tirer 'ls -l ' pour voir quel fichier y est exécutable ? Alors dois-je retaper toute la commande ! Non je n'ai pas besoin. J'ai juste besoin de porter le dernier argument de cette nouvelle commande comme :

$ ls -l !$

Ici !$ portera les arguments passés dans la dernière commande à cette nouvelle commande.

4. Comment gérer deux arguments ou plus en utilisant (!)

Disons que j'ai créé un fichier texte 1.txt sur le Bureau.

$ touch /home/avi/Desktop/1.txt

puis copiez-le dans '/home/avi/Downloads ' en utilisant le chemin complet de chaque côté avec cp commande.

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

Nous avons maintenant passé deux arguments avec cp commande. Le premier est '/home/avi/Desktop/1.txt ' et le second est '/home/avi/Downloads ', gérons-les différemment, exécutez simplement echo [arguments] pour imprimer les deux arguments différemment.

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

Remarque le 1er argument peut être imprimé sous la forme “!^” et le reste des arguments peut être imprimé en exécutant “![Name_of_Command]:[Number_of_argument]” .

Dans l'exemple ci-dessus, la première commande était 'cp ' et le 2ème argument était nécessaire pour imprimer. D'où “!cp:2” , si une commande dit xyz est exécuté avec 5 arguments et vous devez obtenir le 4ème argument, vous pouvez utiliser “!xyz:4” , et utilisez-le comme bon vous semble. Tous les arguments sont accessibles par “!*” .

5. Exécuter la dernière commande sur la base des mots-clés

Nous pouvons exécuter la dernière commande exécutée sur la base de mots-clés. Nous pouvons le comprendre comme suit :

$ ls /home > /dev/null						[Command 1]
$ ls -l /home/avi/Desktop > /dev/null		                [Command 2]	
$ ls -la /home/avi/Downloads > /dev/null	                [Command 3]
$ ls -lA /usr/bin > /dev/null				        [Command 4]

Ici, nous avons utilisé la même commande (ls) mais avec des commutateurs différents et pour différents dossiers. De plus, nous avons envoyé la sortie de chaque commande à '/dev/null ' comme nous n'allons pas nous occuper de la sortie de la commande, la console reste propre.

Exécutez maintenant la dernière commande d'exécution sur la base de mots-clés.

$ ! ls					[Command 1]
$ ! ls -l				[Command 2]	
$ ! ls -la				[Command 3]
$ ! ls -lA				[Command 4]

Vérifiez la sortie et vous serez étonné que vous exécutiez des commandes déjà exécutées juste par ls mots-clés.

6. Le pouvoir de !! Opérateur

Vous pouvez exécuter/modifier votre dernière commande d'exécution en utilisant (!!) . Il appellera la dernière commande d'exécution avec alter/tweak dans la commande actuelle. Permet de vous montrer le scénario

Le dernier jour, j'ai exécuté un script en une ligne pour obtenir mon adresse IP privée, alors j'ai exécuté,

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

Puis soudain, j'ai compris que je devais rediriger la sortie du script ci-dessus vers un fichier ip.txt , donc qu'est ce que je devrais faire? Dois-je retaper toute la commande et rediriger la sortie vers un fichier ? Eh bien, une solution simple consiste à utiliser UP touche de navigation et ajouter '> ip.txt' pour rediriger la sortie vers un fichier en tant que.

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

Merci au sauveur de la vie UP touche de navigation ici. Considérez maintenant la condition ci-dessous, la prochaine fois que j'exécuterai un script ci-dessous.

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

Dès que j'ai exécuté le script, l'invite bash a renvoyé une erreur avec le message “bash: ifconfig: command not found” , Il n'a pas été difficile pour moi de deviner que j'exécute cette commande en tant qu'utilisateur alors qu'elle devrait être exécutée en tant que root.

Alors, quelle est la solution ? Il est difficile de se connecter à root puis de retaper toute la commande ! Aussi (touche de navigation vers le haut ) dans le dernier exemple n'est pas venu à la rescousse ici. Alors? Nous devons appeler “!!” sans guillemets, qui appellera la dernière commande pour cet utilisateur.

$ su -c “!!” root

Ici su est le changement d'utilisateur qui est root, -c est d'exécuter la commande spécifique en tant qu'utilisateur et la partie la plus importante !! sera remplacé par commande et la dernière commande d'exécution sera remplacée ici. Ouais! Vous devez fournir un mot de passe root.

J'utilise !! principalement dans les scénarios suivants,

1. Lorsque j'exécute apt-get commande en tant qu'utilisateur normal, j'obtiens généralement une erreur indiquant que vous n'êtes pas autorisé à exécuter.

$ apt-get upgrade && apt-get dist-upgrade

Erreur Opps… ne vous inquiétez pas, exécutez la commande ci-dessous pour réussir..

$ su -c !!

De la même manière que je fais pour,

$ service apache2 start
or
$ /etc/init.d/apache2 start
or
$ systemctl start apache2

OOPS Utilisateur non autorisé à effectuer une telle tâche, donc je cours..

$ su -c 'service apache2 start'
or
$ su -c '/etc/init.d/apache2 start'
or
$ su -c 'systemctl start apache2'
7. Exécutez une commande qui affecte tout le fichier sauf ![FILE_NAME]

Le ! (NON logique ) peut être utilisé pour exécuter la commande sur tous les fichiers/extensions sauf celui qui se trouve derrière '!' .

A. Supprimer tous les fichiers d'un répertoire sauf celui dont le nom est 2.txt .

$ rm !(2.txt)

B. Supprimez tous les types de fichiers du dossier sauf celui dont l'extension est 'pdf ‘.

$ $ rm !(*.pdf)
8. Vérifiez si un répertoire (par exemple /home/avi/Tecmint) existe ou non ? Printf si ledit répertoire existe ou non.

Ici, nous utiliserons '! -d' pour valider si le répertoire existe ou non suivi de l'opérateur ET logique (&&) pour imprimer ce répertoire n'existe pas et Opérateur OU logique (||) pour imprimer le répertoire est présent.

La logique est, lorsque la sortie de [ ! -d /home/avi/Tecmint ] est 0 , il exécutera ce qui se trouve au-delà du ET logique sinon, il ira à OU logique (||) et exécutez ce qui se trouve au-delà du OU logique .

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'
9. Vérifier si un répertoire existe ou non ? Sinon, quittez la commande.

Semblable à la condition ci-dessus, mais ici, si le répertoire souhaité n'existe pas, il quittera la commande.

$ [ ! -d /home/avi/Tecmint ] && exit
10. Créez un répertoire (disons test) dans votre répertoire personnel s'il n'existe pas.

Une implémentation générale en langage de script où si le répertoire souhaité n'existe pas, il en créera un.

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

C'est tout pour le moment. Si vous connaissez ou rencontrez une autre utilisation de '!' ce qui vaut la peine d'être connu, vous pouvez nous faire part de votre suggestion dans les commentaires. Restez connecté !


Linux
  1. Regardez les commandes et les tâches avec la commande Linux watch

  2. Commandes Linux - Présentation et exemples

  3. Comment enregistrer les commandes Linux et les utiliser à la demande

  4. Commandes Linux :jobs, bg et fg

  5. 5 utilisations de la commande mv dans le terminal Linux

Commandes Linux - Guide complet

Comment exécuter automatiquement les scripts et commandes de démarrage Linux

Comment corriger les erreurs et les fautes de frappe dans les commandes de console précédentes sous Linux

Comment exécuter plusieurs commandes Linux en une seule commande

Comment lire la sortie et les utilisations de la commande Linux Top

Comment exécuter plusieurs commandes Linux à la fois dans le terminal Linux