globstar: nom d'option de shell non valide sur macOS même avec bash 4.X

22

La nouvelle globstaroption nécessite bash 4. Alors .. bashSur quoi sommes-nous?

 $bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Essayons globstar:

13:39:28/forecast-fresh $shopt -s globstar
-bash: shopt: globstar: invalid shell option name
13:39:32/forecast-fresh $

Existe-t-il un moyen d'obtenir un support pour cela sur macOS?

javadba
la source

Réponses:

19

En entrant shopt, vous obtiendrez une liste avec toutes les options de bash qui n'inclut pas globstar pour le bash d'Apple. Bash est probablement compilé sans prise en charge de cette option.

Pour obtenir un exécutable bash avec globstar install brew et brew's bash:

$ brew install bash
$ chsh -s /usr/local/bin/bash
$ sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
$ ln -s /usr/local/bin/bash /usr/local/bin/bash-terminal-app

Ensuite, changez le shell par défaut ouvert dans Terminal en / usr / local / bin / bash-terminal-app et supprimez le 'Voulez-vous fermer cet onglet?' lorsque vous fermez les fenêtres et les onglets, ajoutez «bash» à la liste des exclusions.

La nouvelle liste d'options est alors:

$ shopt
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    on
cmdhist         on
compat31        off
compat32        off
compat40        off
compat41        off
compat42        off
compat43        off
complete_fullquote  on
direxpand       off
dirspell        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globasciiranges off
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
inherit_errexit off
interactive_comments    on
lastpipe        off
lithist         off
login_shell     on
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell    off
shift_verbose   off
sourcepath      on
xpg_echo        off

Dans certaines circonstances, / usr / local / share / et ses sous-dossiers appartiennent à root (par exemple, après l'installation de smartmontools, nmap, node, etc. avec leurs programmes d'installation personnalisés) et certaines étapes échouent. À mon avis, il est enregistré dans chown -Rles dossiers de l'utilisateur administrateur qui a installé brew / bash. Dans mon installation presque vanille de macOS et de brew, / usr / local / share et / usr / local / share / locale appartiennent à cet utilisateur administrateur.

klanomath
la source
ce dernier ln -sétait l'étape manquante pour moi.
javadba
1
ça ne marche pas pour moi. /usr/local/bin/bashn'a pas été créé par brew. Et qu'est-ce que c'est bash-terminal-app?
glS
@klanomath Sierra 10.12.6 et infusion 1.5.2. Les exécutables sont installés dans /usr/local/Cellar/...et généralement liés /usr/local/bin. Pour une raison quelconque, cela bashsemble être une exception. brew doctorrévèle la raison probable comme étant qu'il bashn'a pas pu être lié, mais si j'essaye, brew link bashj'obtiens que le lien symbolique n'a pas pu être créé car /usr/local/share/locale/ca/LC_MESSAGES is not writable. J'ai vérifié et n'ai pasbrew été installé en tant que root, comme indiqué dans la page d'accueil.
glS
/usr/local/share/locale/ca/LC_MESSAGESappartient en effet à root, donc non accessible en écriture sans accès root, mais je ne sais pas si je peux le faire en toute sécurité chown. Ce fichier est-il même censé appartenir à root?
glS
@glS Ajouté addendum ...
klanomath