2010-02-04 14 views
53

OSX: Esto funciona desde la línea de comandos:¿Cómo establecer un alias dentro de un script de shell bash para que sea visible desde el exterior?

alias ruby="/opt/local/bin/ruby1.9" 

pero en el lado de un script de shell, no tiene ningún efecto. Quiero escribir un script que cambie entre ruby ​​1.8 y ruby ​​1.9, por lo que debe ser un script, no en mi perfil.

Parece que "fuente script.sh" funciona, pero "./script.sh". ¿Por qué es esto? ¿Cómo puedo replicar esto en mi script?

Respuesta

64

./script.sh se ejecutarán en un subconjunto y los cambios realizados solo aplicarán al subconjunto. Una vez que el comando termina, el subconjunto se va y también lo hacen los cambios.

abastecimiento del archivo usando . ./script.sh o source ./script.sh va a leer y ejecutar comandos desde el argumento de nombre de archivo en el contexto shell actual, que es cuando una secuencia de comandos se ejecuta utilizando source que se ejecuta dentro de la cubierta existente, cualquier variable creados o modificados por la secuencia de comandos seguirá estando disponible una vez que se complete la secuencia de comandos.

+2

Bien, no sabía este comando 'fuente', gracias :) – jwbensley

7

Puede escribir una función en su .profile para cambiar los alias

function toggle-ruby() { 
    if [ "$1" == "1.9" ]; then 
    alias ruby=/opt/local/bin/ruby1.9 
    else 
    alias ruby=/opt/local/bin/ruby1.8 
    fi 
} 

continuación, ejecute puede ejecutar:

toggle-ruby 1.9 

o

toggle-ruby 1.8 

para cambiar de ida y vuelta .

+1

este es un buen enfoque. ¡Gracias! –

85

La respuesta simple para usted es que los scripts crean shells no interactivos y, de forma predeterminada, la opción expand_aliases a menudo está deshabilitada.

Puedes solucionar este problema de manera muy sencilla con sólo añadir la siguiente línea en la parte superior de la secuencia de comandos para permitir la expansión de alias: expand_aliases

shopt -s

Este problema me ha estado molestando , entonces investigé y luego escribí una publicación en el blog una vez que descubrí cómo solucionarlo por mí mismo: Post about using alias from within Linux shell scripts.

Por supuesto, justo después de descubrir esa parte, encontré eso, cuando Si funciona para lo que necesita, no funcionará si tiene una subshell dentro de una subshell. Todavía estoy buscando la solución para ese problema, así es como me encontré con su pregunta. En la publicación del blog, menciono un truco barato que utilizo para tomar el alias en un guión de shell. No es elegante, pero en realidad funciona incluso en este problema de subshell múltiple que tengo.

+10

Esta es una respuesta mucho mejor que la aceptada. Si ha aterrizado aquí desde una búsqueda, este es probablemente lo que desea. – bahamat

+5

aunque esto no es lo que el OP pretendía, ¡es exactamente lo que estaba buscando! gracias –

+0

Perfecto. Esto es mucho mejor que la respuesta aceptada. – Qix

7

Si necesita cambiar las versiones de Ruby, intente rvm.

+0

Y en Linux, 'update-alternatives' para otros ejecutables en general. Aparentemente no en OS X: http://apple.stackexchange.com/questions/76704/how-to-set-alternatives-in-10-8 –

Cuestiones relacionadas