Quelle est cette variable de formulaire = $ (…)

Que signifie ce qui suit?

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 

Je suis particulièrement intéressé par cette partie:

 varible=$(...) 

Je sais que les parenthèses sont utilisées pour exécuter un sous-process, mais que faire si elles sont utilisées avec $ ?

Du manuel Bash ( man bash ):

    Substitution de command
        La substitution de command permet la sortie d'une command pour replace le
        nom de la command.  Il y a deux forms:

               $ (command)
        ou
               `command`

        Bash effectue l'expansion en exécutant la command dans un sous-shell
        environnement et replace la substitution de command par la norme
        sortie de la command, avec toutes les nouvelles lignes de fin supprimées.  Intégré
        les nouvelles lignes ne sont pas supprimées, mais elles peuvent être supprimées pendant le mot
        scission.  La substitution de la command $ (file cat) peut être remplacée par la command
        équivalent mais plus rapide $ (<file).

(Ceci est valable pour tous les shells de type Bourne, par exemple sh , ksh , zsh , bash etc. et zsh est également capable de capturer des données avec des caractères NUL incorporés de cette manière)

La command

 basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 

affectera le nom du directory où se trouve le script (tout en changeant toutes les barres obliques inverses en barres obliques) à la base basedir . Toutes les erreurs, avertissements ou autres messages de diagnostic envoyés au stream d'erreur standard seront toujours affichés sur le terminal ( $(...) ne capturant que la sortie standard de la command).

Le shell commencera par l'exécution de la substitution de command la plus interne:

 echo "$0" | sed -e 's,\\,/,g' 

La sortie de celui-ci sera donnée sous forme de string à dirname , et la sortie de celle-ci sera assignée à la variable basedir .

Les guillemets sont là pour s'assurer qu'aucun mot de scission ou de nom de file ne sera fait, sinon vous risquez de constater que le script échoue ou produit une sortie étrange quand $0 (le nom du script incluant le path utilisé pour l'exécuter) contient un un caractère d'espace ou un caractère de nom de file (par exemple ? ou * ).

C'est généralement une bonne idée de toujours citer les expansions (expansions variables, substitutions de commands et expansions arithmétiques). Voir cette question et ses réponses pour une excellente explication de la raison pour laquelle c'est une bonne idée.

Si le script a été exécuté comme

 $ /usr/local/bin/script.sh 

alors basedir obtiendra la valeur de /usr/local/bin .

Ou, sur Cygwin:

 $ bash c:\\Users\\Me\\script.sh 

alors basedir obtiendra la valeur de c:/Users/Me . Les doubles barres obliques inverses sur la command line dans ce cas sont juste pour échapper aux antislashs uniques du shell. La valeur réelle de $0 est c:\Users\Me\script.sh .

Une autre façon de faire la même chose sans utiliser dirname , echo et sed serait

 basedir="${0//\\//}" basedir="${basedir%/*}" 

Cela signifie exécuter ce qui est à l'intérieur des parenthèses dans un sousshell et le renvoyer en tant que valeur , dans votre cas l'assignant à varible .

Le varible=$(..) appelé Substitution de commands et cela ne signifie rien d'autre que d'exécuter une command shell et de stocker sa sortie dans une variable ou l'afficher en utilisant la command echo. Par exemple, affichez la date et l'heure:

 echo "Today is $(date)" 

et pour le stocker à une variable:

 SERVERNAME=$(hostname) 

Pour plus d'informations: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/