Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 5 novembre 2017

Le paquet trash-cli ou comment utiliser la corbeille en ligne de commande

On a tous à un moment ou à un autre supprimé un fichier par erreur sous Linux.

On remédie souvent à cette situation malheureuse par un:

alias rm='rm -i'

Cependant, il existe un moyen de se passer de la confirmation de suppression de la commande rm et cela consiste à utiliser la corbeille en ligne de commande.

Linux propose en effet le paquet trash-cli que l'on installe comme suit:

sudo apt-get install trash-cli

Et pour supprimer un fichier, plutôt que d'utiliser la commande rm:

trash-put Readme.md 

Puis:

trash-put Profiles.zip 

Pour afficher la liste des fichiers présents dans la corbeille:

trash-list 
2017-11-05 16:34:05 /home/user/Profiles.zip
2017-11-05 16:33:51 /home/user/Readme.md

La timestamp affiché étant la date de suppression du fichier.

Supposons maintenant que j'ai supprimé Readme.md par erreur:

user@machine:~$ restore-trash 
   0 2017-11-05 16:34:05 /home/pyfourmond/Profiles.zip
   1 2017-11-05 16:33:51 /home/pyfourmond/Readme.md
What file to restore [0..1]: 

Il me suffit alors de sélectionner le numéro du fichier pour que celui-ci soit restauré.

Le paquet trash-cli fournit aussi la commande restore-trash qui permet de rétablir l'intégralité des fichiers placés à la corbeille.

Et on peut maintenant définir:

alias rm='trash-put'

mardi 15 août 2017

Utilisation des alias Bash en mode interactif ou non

Avec Bash, les alias sont définis dans le fichier .bashrc ou plus proprement dans le fichier .bash_aliases qui normalement est chargé depuis .bashrc comme suit:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Si j'ai défini:

alias ll='ls -l

Alias en mode interactif

La commande ll donnera le résultat suivant:

user@machine:~$ ll
total 60
drwxr-xr-x 2 user user  4096 juil. 23 17:03 bin
drwxr-xr-x 2 user user  4096 août   3 21:41 Bureau
drwxr-xr-x 6 user user  4096 juil.  9 18:00 Documents
drwxr-xr-x 2 user user  4096 avril 29 14:20 Enregistrements
drwxr-xr-x 4 user user  4096 juin  14 07:39 Images
drwxr-xr-x 2 user user  4096 nov.   9  2016 Modèles
drwxr-xr-x 2 user user  4096 nov.  23  2016 Musique
drwxr-xr-x 9 user user  4096 juin  13 08:51 Programs
drwxr-xr-x 2 user user  4096 nov.   9  2016 Public
drwxr-xr-x 8 user user  4096 juin   4 07:25 Sources
drwxr-xr-x 6 user user 12288 août   2 07:59 Téléchargements
drwxr-xr-x 7 user user  4096 juin   5 06:31 Vidéos
drwxr-xr-x 9 user user  4096 juin  30 19:32 VirtualBox VMs

Expansion des alias

C'est normal me direz-vous. En fait, l'alias ll qui a été défini est utilisable parce que je suis dans un Shell interactif et que par défaut Bash autorise l'expansion des alias dans un Shell interactif.

On peut s'en convaincre en désactivant cette option:

user@machine:~$ shopt -u expand_aliases
user@machine:~$ ll
bash: ll : commande introuvable
user@machine:~$ alias
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -l'
alias ls='ls --color=auto'
alias rm='rm -i'

Les alias sont définis, ils existent mais ne sont pas utilisables pour autant !

Alias en mode non interactif

En mode non interactif, c'est à dire dans un script Shell lançé sans l'option -i, les choses sont différentes.

Première différence, le script .bash_aliases n'est pas chargé puisque .bashrc ne l'est pas. Ah bon ?

Il suffit de regarder le début du fichier .bashrc pour s'en convaincre:

user@machine:~$ more .bashrc 
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Vos alias habituels ne seront donc pas connus dans les scripts.

C'est en fait assez heureux si l'on considère les alias couramment définis sur les commandes rm et cp avec une demande de confirmation: dans un script mieux vaut ne pas avoir à répondre à des questions !

Deuxième différence, l'expansion des alias n'est pas activée par défaut dans un Shell non interactif.

Considérons le script suivant:

#!/bin/bash

alias ll='ls -l'
alias
ll
user@machine:~$ alias.sh
alias ll='ls -l'
/home/user/alias.sh: ligne 5: ll : commande introuvable

L'alias défini dans le script lui même n'est pas utilisable !!!

En revanche si j'ajoute en début de script la ligne suivante:

shopt -s expand_aliases

mon alias est connu depuis le script. On pensera donc à ajouter cette commande, avant ou après la définition des alias, dans les scripts les utilisant.

Et pour afficher toutes les options actives de Bash:

shopt -s

samedi 13 février 2016

Les options de la commande rm sous Linux

Sous Linux, la suppression de fichiers s'effectue avec la commande rm:

Par exemple:

rm file

SI un des fichiers n'existe pas, la commande rm le signale à l'utilisateur mais continue de supprimer les autres fichiers spécifiés:

rm file-not-found file
rm: impossible de supprimer « file-not-found »: Aucun fichier ou dossier de ce type

Ce mode de fonctionnement est très dangereux parce que si j'entre la commande:

rm to_remove *

et que par inadvertance, j'ai ajouté un espace entre 'to_remove' et '*', j'aurais droit au message suivant:

rm: impossible de supprimer « to_remove »: Aucun fichier ou dossier de ce type

Et la commande rm aura supprimé TOUS les fichiers du répertoire courant puisque le Shell aura interprété l'astérisque en ce sens !

Heureusement pour moi, si dans ce répertoire courant se trouvent aussi des répertoires, le message d'erreur de rm sera:

rm: impossible de supprimer « to_remove »: Aucun fichier ou dossier de ce type
rm: impossible de supprimer « folder1 »: est un dossier
rm: impossible de supprimer « folder2 »: est un dossier
rm: impossible de supprimer « folder3 »: est un dossier

puisque rm ne supprime les répertoires qu'en présence de l'option -r sur la ligne de commande.

Pour éviter de supprimer des fichiers que l'on souhaitait garder, il suffit de passer à la commande rm l'option -i comme suit:

rm -i a z c
rm : supprimer fichier « a » ? yes
rm: impossible de supprimer « z »: Aucun fichier ou dossier de ce type
rm : supprimer fichier « c » ? yes

C'est d’ailleurs une pratique courante (et saine !) de définir l'alias suivant:

alias rm='rm -i'

dans votre fichier .bash_aliases

On peut aussi utiliser -I qui ne demandera qu'une confirmation de suppression lorsqu'il y a plus de 3 fichiers:

touch file1 file2 file3 file4
user@machine:~/tmp$ rm -I file*
rm : supprimer tous les arguments ? 

samedi 8 mars 2014

Quels scripts d'initialisation utiliser sous Debian: .bash_profile ou .bashrc ?

Quand on définit des alias ou qu'on modifie le PATH sous Linux, la question de savoir dans quels scripts d'initialisation du Shell on le fait se pose souvent.

Faut t-il définir les alias dans le fichier .bash_profile de l'utilisateur ou dans le fichier .bashrc ?

Avant de répondre à cette question, il faut savoir qu'il y a deux types de Shell: les Shell de connexion (ou de login) et les autres.

Le Shell de connexion est celui qui est invoqué lorsqu'on se connecte sur la console:

  • lors de la connexion physique à une machine dépourvue d'environnement graphique,
  • ou en utilisant les raccourcis Ctrl-Alt F1, Ctrl-Alt F2 ...,
  • ou lors d'une connexion à une machine distante via ssh

et aussi si on utilise la commande bash --login.

Tous les autres Shells lançés par un Shell de connexion n'en sont donc pas. Les Anglais parlent de "non-login Shell".

Donc pour revenir aux scripts d'initialisation du Shell du répertoire courant de l'utilisateur:

  • .bash_profile est le script d'initialisation des Shells de login,
  • .bashrc est le script d'initialisation des autres Shell,

Selon l'usage des alias que l'on veut faire, on les définira dans un fichier ou dans un autre.

Mais un alias définit dans .bash_profile ne sera pas visible par un Shell lancé depuis l'environnement graphique puisque le Shell utilisé dans ce cas n'est pas un Shell de login.

Par contre sous Debian les définitions d'alias faites dans .bashrc seront utilisables non seulement dans un "non-login Shell" puisqu'ils sont définis dans le script d'initialisation de ceux-cis mais aussi par les Shells de login puisque sous Debian généralement .bashrc est appelé par .bash_profile comme suit:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Par conséquent, la façon la plus simple de définir des alias, le PATH ou de faire d'autres réglages sous Debian consiste à le faire dans le fichier .bashrc. Sur d'autres distributions Linux, cela reste évidemment vrai tant que l'on source .bashrc depuis .bash_profile.

Enfin, il faut savoir que si le fichier .bash_profile n'existe pas alors c'est le fichier .profile qui sera recherché.