Solo quiero entender la siguiente línea de código en shell. Se utiliza para obtener el directorio de trabajo actual. Soy consciente de que el $(variable)
nombre devuelve el valor dentro del nombre de la variable, pero ¿qué se $(command)
supone que debe devolver? ¿Devuelve el valor después de ejecutar el comando? En ese caso, podemos usar `
para ejecutar el comando.
CWD="$(cd "$(dirname $0)"; pwd)"
La misma salida se puede tomar de la siguiente línea de código también en diferentes versiones de shell
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
No puedo entender el significado de $(cd..
y $(dirname
.
¿Alguien podría ayudarme a descubrir cómo se ejecuta este comando?
$()
vs``
.: stackoverflow.com/questions/9449778/…Respuestas:
El uso de
$
similares${HOME}
da el valor de HOME. El uso de medios$
similares$(echo foo)
ejecuta lo que esté dentro del paréntesis en una subcapa y lo devuelve como valor. En mi ejemplo, obtendríafoo
yaecho
que escribiráfoo
en la salida estándarfuente
$(...)
es una mejor forma de escribir un comando que intentar utilizar comillas inversas. Considere la posibilidad de escribir:gcclib=$(dirname $(dirname $(which gcc)))/lib
utilizando comillas inversas. Incluso antes de tener las dificultades de hacerlo en Markdown, es más difícil porque tiene que escapar de las comillas inversas de los comandos anidados, mientras que no lo hace con la$(...)
notación.$(echo foo)
crea una sustitución de comando, no una subcapa. La otra respuesta actual es correcta. Creo que la sustitución de comandos se ejecuta en una subcapa, más o menos, pero siguen siendo conceptos diferentes.$(echo foo)
intentará ejecutar lo que se devuelve desde el paréntesis, primero se ejecutará yecho foo
luego intentará ejecutarse, lofoo
que da un errorVeamos diferentes partes del comando.
BASH_SOURCE
es una variable de matriz de bash que contiene nombres de archivo de origen. Entonces"${BASH_SOURCE[0]}"
le devolvería el nombre del archivo de script.dirname
es una utilidad proporcionada por GNU coreutils que elimina el último componente del nombre del archivo. Por lo tanto, si ejecuta su script diciendobash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
volvería.
. Si lo dijerasbash ../foo
, volvería..
; porquebash /some/path/foo
volvería/some/path
.Finalmente, todo el comando
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
obtiene el directorio absoluto que contiene el script que se invoca.$(...)
permite la sustitución de comandos, es decir, permite que la salida de un comando reemplace al comando en sí y se puede anidar.fuente
dirname
devuelve la ruta del archivo ejecutado (relativa o absoluta al directorio de trabajo actual),cd
cambia el pwd a ese directorio epwd
imprime la ruta absoluta del directorio de trabajo actual. Pero, ¿por qué se les unen&&
? ¿Y quéDIR
aguantará sicd
falla?&&
evita que sepwd
ejecute sicd
falla, de modo queDIR
estará vacío en lugar de tener un directorio incorrecto.