120 votes

Quelle est la différence entre le tiret simple et le tiret double sur les commandes Shell ?

C'est la première fois que je travaille dans le Shell et l'utilisation de ces commandes semble arbitraire. Y a-t-il une raison pour laquelle un drapeau a un simple tiret et un autre pourrait avoir un double tiret ?

1 votes

Ce lien est maintenant 404 @cjc :( Un lien peut-être plus fiable pourrait être fr.wikipedia.org/wiki/POSIX

3 votes

Meilleur lien : fr.wikipedia.org/wiki/

167voto

psusi Points 3197

Un seul trait d'union peut être suivi de plusieurs drapeaux à un seul caractère. Un double trait d'union préfixe une option unique à plusieurs caractères.

Prenons cet exemple :

tar -czf

Dans cet exemple, -czf spécifie trois drapeaux à un seul caractère : c , z et f .

Prenons maintenant un autre exemple :

tar --exclude

Dans ce cas, --exclude spécifie une option unique, à plusieurs caractères, nommée exclude . Le double trait d'union désambiguïse l'argument de la ligne de commande, garantissant que tar l'interprète comme exclude plutôt qu'une combinaison de e , x , c , l , u , d et e .

0 votes

Ohh... c'est tout à fait logique. Est-ce que tar --c être également reconnu ?

1 votes

@kylex, non, puisqu'il n'y a pas d'option longue nommée juste "c" et que le -- signifie une option longue, pas une option à caractère unique qui suit.

24 votes

Parfois, même les commandes longues peuvent être en simple pointillé. Par exemple, 'cdrecord' utilise toutes les commandes à tiret unique (-eject -dao ...). Tout dépend du programme, mais la plupart( !) d'entre eux utilisent - pour les commandes à un seul caractère et -- pour les commandes à plusieurs caractères (longues).

28voto

mulaz Points 10362

Tout dépend du programme. Habituellement, "-" est utilisé pour les options "courtes" (une lettre, -h), et "--" est utilisé pour les options "longues" (--help).

Les options courtes peuvent généralement être combinées (ainsi "-h -a" est identique à "-ha").

Dans les systèmes de type Unix, le tiret ASCII moins est couramment utilisé pour spécifier des options. Ce caractère est généralement suivi d'une ou plusieurs lettres. Un argument qui est un simple trait d'union minuscule sans aucune lettre indique généralement qu'un programme doit traiter les données provenant de l'entrée standard ou envoyer des données à la sortie standard. Deux traits d'union ( -- ) sont utilisés dans certains programmes pour spécifier des "options longues" où des noms d'options plus descriptifs sont utilisés. Il s'agit d'une caractéristique commune aux logiciels GNU.

source

4 votes

Alors pourquoi c'est java -version et ant -version ?

0 votes

@killjoy Parce que ce ne sont pas des commandes UNIX et que les développeurs de logiciels sont libres de faire suivre à leurs programmes des règles différentes de celles des commandes UNIX traditionnelles.

14voto

ssice Points 221

C'est vraiment une convention. Cependant, elle peut aider les analyseurs à connaître plus efficacement les options passées au programme. De plus, il existe des utilitaires astucieux qui peuvent aider à analyser ces commandes, tels que getopt(3) ou la version non standard getopt_long(3) pour aider à analyser les arguments d'un programme.

C'est bien, car nous pouvons avoir plusieurs options courtes combinées, comme le disent d'autres réponses, par exemple tar -xzf myfile.tar.gz .

S'il y avait un argument "lisa" pour ls il y aurait probablement un sens différent à taper. ls -lisa que ls --lisa . Les premiers sont les l , i , s et a les paramètres, pas le mot.

En fait, vous pourriez écrire ls -l -i -s -a qui signifie exactement la même chose que ls -lisa mais cela dépend du programme.

Il existe également des programmes qui n'obéissent pas à cette convention. Notamment pour ma vue, dd und gcc .

7voto

Premraj Points 345

options courtes avec simple tiret vs options longues avec double tiret

Les options courtes peuvent être combinées en un seul argument ;

for example: ls -lrt #instead of ls -l -r -t

Si nous autorisons les options longues avec un seul tiret, cela crée une ambiguïté. Pour résoudre ce problème, nous utilisons le double tiret pour les options longues.

1voto

smalers Points 101

Un autre cas est celui où un script appelle un autre programme, il peut être nécessaire de séparer les options du premier script de celles passées au second programme. Par exemple, vous pouvez écrire une fonction bash pour analyser la ligne de commande, similaire à la fonction ci-dessous. Ensuite, utilisez une ligne de commande similaire à la suivante. Dans ce cas, les doubles tirets maintiennent les options de chaque programme séparées et permettent à la gestion des erreurs de l'analyseur intégré de fonctionner comme prévu. Bien sûr, il peut y avoir des cas particuliers qui doivent être traités.

 firstscript --firstScriptOption -- --optForSecondProgram

# Parse the command line and set variables to control logic.
parseCommandLine() {
  local additionalOpts exitCode optstring optstringLong
  # Indicate specification for single character options:
  # - 1 colon after an option indicates that an argument is required
  # - 2 colons after an option indicates that an argument is optional, must use -o=argument syntax
  optstring="h"
  # Indicate specification for long options:
  # - 1 colon after an option indicates that an argument is required
  # - 2 colons after an option indicates that an argument is optional, must use --option=argument syntax
  optstringLong="help"
  # Parse the options using getopt command:
  # - the -- is a separator between getopt options and parameters to be parsed
  # - output is simple space-delimited command line
  # - error message will be printed if unrecognized option or missing parameter but status will be 0
  # - if an optional argument is not specified, output will include empty string ''
  GETOPT_OUT=$(getopt --options ${optstring} --longoptions ${optstringLong} -- "$@")
  exitCode=$?
  if [ ${exitCode} -ne 0 ]; then
    # Call a separate function to print usage.
    printUsage
    exit 1
  fi
  # The following constructs the command by concatenating arguments:
  # - the $1, $2, etc. variables are set as if typed on the command line
  # - special cases like --option=value and missing optional arguments are generically handled
  #   as separate parameters so shift can be done below
  eval set -- "${GETOPT_OUT}"
  # Loop over the options:
  # - the error handling will catch cases were argument is missing
  # - shift over the known number of options/arguments
  while true; do
    #echo "Command line option is ${opt}"
    case "$1" in
      -h|--help) # Print usage of this script
        printUsage
        shift
        ;;
      --) # No more arguments - following arguments are passed to the second program.
        shift
        break
        ;;
      *) # Unknown option - will never get here because getopt catches up front
        # and remaining options are after --
        echo "Invalid option $1." >&2
        printUsage
        exit 1
        ;;
    esac
  done
  # Get a list of all command line options that do not correspond to dash options:
  # - These are "non-option" arguments after --
  # - For example, one or more file or folder names that need to be processed.
  # - If multiple values, they will be delimited by spaces.
  # - Command line * will result in expansion to matching files and folders.
  shift $((OPTIND-1))
  additionalOpts=$*
  echo "Additional options: ${additionalOpts}"
  # The additional options would be passed to the second program.
}

1 votes

C'est différent, le double tiret dans votre exemple signifie la fin des options de la commande, donc, tout ce qui suit sera interprété comme du texte (pas un argument de commande). Dans l'exemple ci-dessus, l'option --optForSecondProgram sera interprété comme un texte ou un nom de fichier (selon le programme).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X