zshell ohmyzsh make mac instalar for macos bash shell default homebrew

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 que Ftpd will not allow users to connect who are not using one of these shells.
  • simplemente salga y reinicie Terminal.app (o iTerm.app ) para que el cambio surta efecto. Verifique el nuevo shell con echo $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 error dscl 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.