¿Hay alguna forma de marcar una secuencia de comandos para ser «ejecutar como fuente» así que usted no tiene que agregar el source o «.» comando cada vez? es decir, si yo escribo un guión llamado «sup», me gustaría que me llame como

sup Argument

lugar de

source sup Argument

o

. sup Argument

Básicamente, estoy tratando de utilizar cd dentro de una secuencia de comandos.

  • por favor aclarar. el problema de hacer que el script exectuable y la cuestión de la utilización de «cd» dentro de una secuencia de comandos no son la misma cosa.
  • «¿Hay alguna forma de marcar una secuencia de comandos para ser «ejecutar como fuente» así que usted no tiene que agregar la fuente o «.» comando cada vez?»
  • Usted tiene dos problemas diferentes aquí, que es la razón por la que pedí una aclaración. Usted puede hacer scripts ejecutables, y entonces no se necesita «.» o «fuente», pero no voy a ser capaz de modificar los contactos telefónicos de medio ambiente (el shell ejecuta desde). Así, cd hace ningún cambio a la persona que llama. Diferentes problemas.
InformationsquelleAutor typeoneerror | 2009-04-15

4 Comentarios

  1. 31

    Bash horquillas y las estrellas una subshell manera antes de él o de su núcleo, incluso, considera que lo que se suponía que debía hacer allí. No es algo que se puede «deshacer». Así que no, es imposible.

    Afortunadamente.

    Mirar en bash funciones en su lugar:

    sup() {
        ...
    }

    Poner eso en su ~/.bashrc.

  2. 24

    Cuando se ejecuta un shell, hay dos formas de invocar un script de shell:

    • La ejecución de una secuencia de comandos genera un nuevo proceso dentro del cual se ejecuta el script. Esto se hace escribiendo el nombre del script, si es ejecutable y se inicia con un

      #!/bin/bash

      línea, o la invocación directa

      /bin/bash mycmd.sh

    • De abastecimiento una secuencia de comandos se ejecuta dentro de sus padres shell (es decir, el que está escribiendo comandos en). Esto se hace escribiendo

      source mycmd.sh

      o

      . mycmd.sh

    Por lo que el cd dentro de un script de shell que no es procedente es nunca va a propagar a su padre shell, ya que esto violaría el proceso de aislamiento.

    Si el cd es todo lo que usted está interesado acerca de, usted puede deshacerse de la secuencia de comandos mediante el cd de «accesos directos»… echa un vistazo en el bash doc, en el CDPATH env var.

    De lo contrario, puede utilizar un alias para ser capaz de escribir un comando único, en lugar de procedencia o .:

    alias mycmd="source mycmd.sh"
    • Puedo modificar mi CDPATH, pero todavía no parece funcionar cuando el script se está ejecutando en su «propia» de shell
    • Sí, por supuesto, porque el cambio no obtener propaga a los padres de shell, el que usted está utilizando. Mi comentario iba más acerca de una forma de deshacerse de la secuencia de comandos por completo.
    • eso es perfecto! Nunca pensé que sólo alias
  3. 9

    Crear un alias para la misma:

    alias sup=". ~/bin/sup"

    O a lo largo de esas líneas.

    Ver también: ¿Por qué no cd trabajar en un shell de bash script?


    Responder comentario por el contra-ejemplo: la experimentación con el Shell Korn en Solaris 10, se muestra que puedo hacer:

    $ pwd
    /work1/jleffler
    $ echo "cd /work5/atria" > $HOME/bin/yyy
    $ alias yyy=". ~/bin/yyy"
    $ yyy
    $ pwd
    /work5/atria
    $

    La experimentación con Bash (3.00.16) en Solaris 10 también muestra el mismo comportamiento.


    • Hmm, alias trabajado, pero todavía se ejecuta por separado, en un shell para el ‘cd’ en el script no hace nada. Gracias!
    • En ese caso, probablemente se vaya con el CDPATH solución en la que se hace referencia a la pregunta? Es lo que yo uso principalmente. Lo que realmente está en el guión? Sólo un ‘cd’ o de un montón de cosas más?
    • +1 por alias sugerencia
  4. 4

    No es posible origen de una secuencia de comandos en el entorno actual, si usted sub-shell script en invocar.

    Sin embargo, usted puede comprobar que el guión es de origen y la fuerza de la secuencia de comandos para terminar si no:

    if [ -z "$PS1" ] ; then
        echo -e "This script must be sourced. Use \"source <script>\" instead."
        exit
    fi

    De la misma manera, usted puede fuerza de un guión de no ser de origen pero para ser sub-shell en lugar de (preservar el actual entorno de la shell):

    if [ "$PS1" ] ; then
        echo -e "This script cannot be sourced. Use \"./<script>\" instead."
        return
    fi

    Ambas versiones están disponibles como gist: ver por favor, fuente y no se fuente.

Dejar respuesta

Please enter your comment!
Please enter your name here