globstar: Ungültiger Shell-Optionsname unter macOS, auch mit Bash 4.X

21

Die neue globstarOption erfordert bash 4. Also, auf welchen bashsind wir?

 $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>

Probieren wir aus globstar:

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

Gibt es eine Möglichkeit, dies unter macOS zu unterstützen?

Javadba
quelle

Antworten:

18

Wenn shoptSie eingeben, erhalten Sie eine Liste mit allen Bash-Optionen, die Globstar für Apples Bash nicht enthalten. Wahrscheinlich wird Bash ohne Unterstützung für diese Option kompiliert.

Um eine ausführbare Bash-Datei mit globstar zu erhalten, installieren Sie brew und 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

Ändern Sie dann die in Terminal geöffnete Standard-Shell in / usr / local / bin / bash-terminal-app und unterdrücken Sie die Option "Möchten Sie diese Registerkarte schließen?". Wenn Sie Fenster und Registerkarten schließen, fügen Sie der Ausschlussliste "bash" hinzu.

Die neue Optionsliste lautet dann:

$ 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

Unter bestimmten Umständen gehören / usr / local / share / und seine Unterordner root (z. B. nach der Installation von smartmontools, nmap, node usw. mit ihren benutzerdefinierten Installationsprogrammen), und einige der Schritte schlagen fehl. Meiner Meinung nach wird es in chown -Rden Ordnern des Administrators gespeichert, der brew / bash installiert hat. In meiner fast Vanilla-Installation von macOS und brew gehören / usr / local / share und / usr / local / share / locale diesem Administrator.

klanomath
quelle
Das letzte ln -swar der fehlende Schritt für mich.
Javadba
1
das klappt bei mir nicht /usr/local/bin/bashwurde nicht erstellt von brew. Was ist das auch bash-terminal-app?
glS
@klanomath Sierra 10.12.6 und Brew 1.5.2. Die ausführbaren Dateien sind in installiert /usr/local/Cellar/...und normalerweise verlinkt /usr/local/bin. Aus irgendeinem Grund bashscheint dies jedoch eine Ausnahme zu sein. brew doctorzeigt den wahrscheinlichen Grund, dass bashdas nicht verknüpft werden konnte, aber wenn ich versuche, brew link basherhalte ich, dass der Symlink nicht erstellt werden konnte, weil /usr/local/share/locale/ca/LC_MESSAGES is not writable. Ich habe es überprüft und es brewwurde nicht als root installiert, wie auf der Homepage empfohlen.
glS
/usr/local/share/locale/ca/LC_MESSAGESist zwar im eigentum von root also ohne root-zugriff nicht beschreibbar, aber ich bin mir nicht sicher, ob ich es sicher gerade chownkann. Soll sich diese Datei überhaupt im Besitz von root befinden?
glS
@glS Nachtrag hinzugefügt ...
klanomath