macos - ohmyzsh - oh my zshell mac
¿Cómo puedo hacer que iTerm use la versión más reciente de bash que brew muestra? Cambiar el shell de un usuario en OSX (3)
Cuando hago la brew upgrade
, veo que tengo la versión más nueva. ¿Como puedo usar lo?
$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
$ brew upgrade bash
Error: bash-4.2.45 already installed
$ which bash
/bin/bash
Yo veo que tengo
/usr/local/Cellar/bash/4.2.45/bin
pero cuando lo hago
$ /usr/local/Cellar/bash/4.2.45/bin/bash
Todavía estoy en
$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
08:06:45 mdurrant w89123148q1 /usr/local/Cellar/bash/4.2.45/bin master
Los contenidos de /etc/shells
son:
/usr/local/Cellar/bash/4.2.45/bin/bash # (I added this)
/usr/local/bin/bash
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
chsh no parecía hacer lo que esperaba
$ chsh -s /usr/local/Cellar/bash/4.2.45/bin/bash
Changing shell for mdurrant.
Password for mdurrant:
chsh: /usr/local/Cellar/bash/4.2.45/bin/bash: non-standard shell
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Tengo el archivo aquí:
$ l /usr/local/Cellar/bash/4.2.45/bin/bash
-r-xr-xr-x 1 mdurrant admin 699688 Apr 14 19:54 /usr/local/Cellar/bash/4.2.45/bin/bash*
Todavía no he visto realmente la nueva versión de bash, por lo que intento invocarla interactivamente.
$ echo $BASH_VERSION
muestra
3.2.51(1)-release
Traté de usar dscl y lo hice
> change Local/Default/Users/mdurrant UserShell /bin/bash /usr/local/Cellar/bash/4.2.45/bin/bash
pero consiguió
<main> attribute status: eDSAttributeNotFound
<dscl_cmd> DS Error: -14134 (eDSAttributeNotFound)
y ahora muestra la lista
> UserShell: /usr/local/Cellar/bash/4.2.45/bin/bash
La respuesta fue que, sí, necesitaba:
-
brew install bash
- agregar el camino a
/etc/shells
- utilizar
chsh -s
:chsh -s /usr/local/Cellar/bash/4.2.45/bin/bash
posiblemente use dscl para establecer el shell, es decir, dentro del tipo
dscl
> change Local/Default/Users/<username> UserShell /bin/bash /usr/local/bin/zsh
Más importante:
- salga de la terminal (cierre la aplicación, no solo sus ventanas).
- reiniciar
el eco de $BASH_VERSION
después de reiniciar mostró 4.2.45(2)-release
No deberías tener que hacer nada más que correr:
echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash
Después de eso, iTerm y Terminal deben usar /usr/local/bin/bash
para nuevos shells.
chsh
, dscl
y el panel de preferencias de Usuarios y Grupos modifican /var/db/dslocal/nodes/Default/users/$USER.plist
.
bash --version
(o bash -version
) NO informará la versión del shell ACTUAL, sino la versión del ejecutable de bash
que viene PRIMERO EN EL $PATH
.
[Nota: OSX 10.10 (Yosemite) es la primera versión de OSX donde se coloca /usr/local/bin
ANTES de las rutas del sistema como /bin
en $PATH
. Hasta 10.9, las rutas del sistema eran las primeras. Así, en el momento en que el OP hizo su pregunta, bash --version
informó la versión de bash del SYSTEM ( /bin/bash
), no la versión instalada de Homebrew ( /usr/local/bin/bash
)]
Si quieres saber la versión actual de Bash shell, usa:
echo $BASH_VERSION
En otras palabras: su shell puede haber sido cambiado exitosamente - su prueba fue defectuosa.
Puede usar chsh
para cambiar el shell del usuario actual, de la siguiente manera:
[Actualización: Cambié a usar /usr/local/bin/bash
lugar de una ruta versionada específica en /usr/local/Cellar/bash/<version>/bin/bash
, ya que Homebrew mantendrá automáticamente el enlace simbólico en /usr/local/bin/bash
señaló la versión instalada más reciente. Punta del sombrero a @drevicko.]
# First, add the new shell to the list of allowed shells.
sudo bash -c ''echo /usr/local/bin/bash >> /etc/shells''
# Change to the new shell.
chsh -s /usr/local/bin/bash
Tenga en cuenta que se le pedirá su contraseña.
Cualquier pestaña / ventana de terminal que cree a partir de ese momento ya usará el nuevo shell.
Sugerencia adicional de @bmike: si desea reemplazar la instancia de shell actual con una instancia de la nueva shell de inmediato, ejecute:
exec su - $USER # instantly replaces current shell with an instance of the new shell
Tenga en cuenta que se le pedirá su contraseña de nuevo.
Como alternativa, use dscl
, la CLI de los servicios de directorio de OSX, para cambiar el shell del usuario actual; Sin embargo, esto es más engorroso .
Para examinar el shell del usuario actual, use:
dscl . -read /Users/$USER UserShell # e.g. (default): ''UserShell: /bin/bash''
o, más simplemente, echo $SHELL
, que genera solo la ruta del archivo (por ejemplo, /bin/bash
).
Para cambiar el shell del usuario actual a, por ejemplo, /usr/local/bin/bash
, use:
sudo dscl . -change /Users/$USER UserShell /bin/bash /usr/local/bin/bash
Nota:
- el penúltimo argumento debe ser el valor actualmente vigente .
- NO es necesario que el nuevo valor esté contenido en
/etc/shells
para uso interactivo , pero los comentarios en/etc/shells
dicen queFtpd will not allow users to connect who are not using one of these shells.
- simplemente salga y reinicie
Terminal.app
(oiTerm.app
) para que el cambio surta efecto. Verifique el nuevo shell conecho $BASH_VERSION
. NO es necesario reiniciar.
Explicación de los errores encontrados por el OP :
-
chsh: /usr/local/Cellar/bash/4.2.45/bin/bash: non-standard shell
implica que/usr/local/Cellar/bash/4.2.45/bin/bash
no estaba - todavía no, o no está en esta forma exacta - listada en/etc/shells
. -
<main> attribute status: eDSAttributeNotFound
: este errordscl
se produce cuando el penúltimo argumento (el siguiente al último) especificado para el comando-change
no coincide con el valor del atributo actual . Es un requisito, ciertamente extraño, que el valor actual de un atributo. Se especificará para cambiarlo.
Si bien la pregunta sugiere que se cumplieron ambas condiciones, sospecho que no se cumplieron en el momento adecuado , debido a la experimentación.