Commande du terminal commençant par un underscore

Karzoff

Membre confirmé
30 Avril 2009
20
0
Blois, France
Bonjour à tous,

Je viens de faire [tab][tab] dans le terminal en n'ayant saisi aucune commande. Naturellement, il m'a demandé "Display all 1936 possibilities? (y or n)". Et j'ai fais Yes.

Dans la liste des commandes affichées, il y en a qui commencent par un underscore.



Ma question : qu'est-ce que c'est ? Qu'on-t-elles de spécial ?

J'en ai essayé certaines. Elles ont rarement un output. (la commande _id n'affiche rien par exemple).

Pareil, avec la commande _cd :

Bloc de code:
laptop:~ karzoff$ pwd
/Users/karzoff
laptop:~ karzoff$ _cd /
laptop:~ karzoff$ pwd
/Users/karzoff
laptop:~ karzoff$

Je suis en bash et Mac Ports est installé.

Merci de m'éclairer :)
 
J'ai MacPorts mais pas ce genre de commandes. Dans quels répertoires se trouvent-elles ?
 
Bonjour bompi,

Aucune idée :
Bloc de code:
laptop:~ karzoff$ whereis cd
/usr/bin/cd
laptop:~ karzoff$ whereis _cd
laptop:~ karzoff$ which cd
/usr/bin/cd
laptop:~ karzoff$ which _cd

Edit :
J'ai peut-être une piste :
Bloc de code:
laptop:~ karzoff$ sudo port installed | grep bash
Password:
  bash-completion @1.2_0 (active)
laptop:~ karzoff$

bash-completion est installé, ça a peut-être un rapport, non ? Mais ça n'explique pas la présence de toutes ces commandes débutant par un underscore, si ? :mouais:

Edit : Encore une piste ! J'ai remarqué plusieurs choses :

  • Il y a aussi des commandes dont le nom commence par deux underscores.
  • Si je commence à saisir une commande débutant par un underscore et que j'appuie sur la touche TAB, l'auto-completion fonctionne (testé avec _ki --> _kill)
  • A l'installation de bash-completion, il faut modifier le fichier .profile et ajouter un petit script qui va charger un fichier bach_completion au lancement du terminal. Quand je fais un cat dessus, j'obtiens un fichier de plus de 1600 lignes (cf. : fichier joint cat bash_completion.txt).

J'ai notamment trouvé ceci :
Bloc de code:
# This meta-cd function observes the CDPATH variable, so that cd additionally
# completes on directories under those specified in CDPATH.
#
_cd()
{
    local cur IFS=$'\t\n' i j k
    _get_comp_words_by_ref cur

    # try to allow variable completion
    if [[ "$cur" == ?(\\)\$* ]]; then
        COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\\)$}" ) )
        return 0
    fi

    # Enable -o filenames option, see Debian bug #272660
    compgen -f /non-existing-dir/ >/dev/null

    # Use standard dir completion if no CDPATH or parameter starts with /,
    # ./ or ../
    if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
        _filedir -d
        return 0
    fi

    local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)

    # we have a CDPATH, so loop on its contents
    for i in ${CDPATH//:/$'\t'}; do
        # create an array of matched subdirs
        k="${#COMPREPLY[@]}"
        for j in $( compgen -d $i/$cur ); do
            if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
                j="${j}/"
            fi
            COMPREPLY[k++]=${j#$i/}
        done
    done

    _filedir -d

    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]}
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/"
        fi
    fi

    return 0
}
if shopt -q cdable_vars; then
    complete -v -F _cd -o nospace cd
else
    complete -F _cd -o nospace cd
fi

J'imagine que ça surcharge l'auto-completion de base de la comande cd. J'ai trouvé d'autres directives de se genre pour d'autres commandes, mais pas pour toutes. Donc tout n'est pas résolu. Par exemple, je n'ai trouvé nulle par dans le fichier bash_completion, de référence à une fonction ou une commande _kill.

Quelqu'un à des idées ?
 
Hello,

Ces trucs se trouvent dans: /usr/share/zsh/4.3.9/functions/

... en tous cas chez moi avec SL.

Ce sont manifestement des scripts qui quelquefois pourraient ressembler à un help (ex: gzip -h) ou à prompter des arguments, mais à vue de nez ce n'est pas tout a fait ça.

Les super-gurus vont certainement nous dire.
 
Ce qui est curieux est que des fonctions zsh soient présents pour bash.
Une petite erreur dans la définition de la variable PATH, non ?

Par ailleurs, chez moi, ces fichiers ne sont pas exécutables.
 
Bonjour et merci pour vos réponses,

bompi a dit:
Par ailleurs, chez moi, ces fichiers ne sont pas exécutables
Chez moi non plus :
Bloc de code:
laptop:~ karzoff$ ls -l /usr/share/zsh/4.3.9/functions/_kill
-rw-r--r--  1 root  wheel  475 11 mai  2009 /usr/share/zsh/4.3.9/functions/_kill
laptop:~ karzoff$ /usr/share/zsh/4.3.9/functions/_kill
-bash: /usr/share/zsh/4.3.9/functions/_kill: Permission denied
laptop:~ karzoff$
J'ai également vérifié depuis un shell zsh, c'est la même chose ; Pire ! Si je commence à saisir "_ki" et que j'appuie sur TAB, rien ne se passe.

bompi a dit:
Une petite erreur dans la définition de la variable PATH, non ?
Je ne pense pas.

Bloc de code:
laptop:~ karzoff$ cat .profile 
# MacPorts PATH
export PATH=/opt/local/bin:/opt/local/sbin:$PATH

# Bash-completion
if [ -f /opt/local/etc/bash_completion ];
then
      . /opt/local/etc/bash_completion
fi
laptop:~ karzoff$