Estoy haciendo lo siguiente dentro de un archivo make
pushd %dir_name%
y me sale el siguiente error
/bin/sh : pushd : not found
¿Alguien puede decirme por qué aparece este error? Revisé mi variable $ PATH y contiene / bin, así que no creo que eso esté causando un problema.
pushd
. ¿Está empujado en su$PATH
?Respuestas:
pushd
es unabash
mejora del Bourne Shell especificado por POSIX.pushd
no se puede implementar fácilmente como un comando, porque el directorio de trabajo actual es una característica de un proceso que los procesos secundarios no pueden cambiar. (Unpushd
comando hipotético podría realizar lachdir(2)
llamada y luego iniciar un nuevo shell, pero ... no sería muy útil.)pushd
Es un shell incorporado, comocd
.Entonces, cambie su secuencia de comandos para comenzar
#!/bin/bash
o almacene el directorio de trabajo actual en una variable, haga su trabajo y luego vuelva a cambiar. Depende de si desea un script de shell que funcione en sistemas muy reducidos (por ejemplo, un servidor de compilación de Debian) o si está bien siempre requiriendobash
.fuente
SHELL = /bin/bash
lugar de comenzar el script con#!/bin/bash
.test1
en mi respuesta, stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/… .#!/bin/bash
sea la primera línea del archivo.añadir
en la parte superior de su archivo Makefile lo encontré en otra pregunta ¿Cómo puedo usar la sintaxis Bash en los destinos de Makefile?
fuente
Una solución alternativa para esto sería hacer que una variable obtenga el directorio de trabajo actual. Luego puede sacarlo de él para hacer lo que sea, luego, cuando lo necesite, puede volver a ingresar.
es decir
fuente
cd
ingresar al directorio que desee y luego hacerlocd -
, no es necesario que use esa$oldpath
variable si no usacd
entremedias. Lo interesante de estopushd
es que cada vez que lo usa, está insertando un directorio en una pila, y luego puede volver al último usopopd
, por lo que tiene sentido usarlo cuando ingresa a más de un directorio y desea un camino seguro de regreso.(cd /new_path ; command )
Esto se debe a que pushd es una función incorporada en bash. Por lo tanto, no está relacionada con la variable PATH y tampoco es compatible con / bin / sh (que se usa por defecto en make. Puede cambiar eso configurando SHELL (aunque no funcionará directamente (test1)).
En su lugar, puede ejecutar todos los comandos
bash -c "..."
. Eso hará que los comandos, incluidos pushd / popd, se ejecuten en un entorno bash (test2).Al ejecutar make test1 y make test2 da lo siguiente:
Para test1, aunque bash se usa como shell, cada comando / línea de la regla se ejecuta por sí mismo, por lo que el comando pushd se ejecuta en un shell diferente al de popd.
fuente
tcsh
(¿y tal vezcsh
?) Terminar su mensaje con>
:$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
pero ahora lo reduje a una cadena genérica para la respuesta. El indicador en DOS también termina>
por defecto con ($P$G
IIRC), y eso me gusta.Su shell (/ bin / sh) está tratando de encontrar 'pushd'. Pero no puede encontrarlo porque 'pushd', 'popd' y otros comandos como ese están construidos en bash.
Ejecute su script usando Bash (/ bin / bash) en lugar de Sh como lo está haciendo ahora, y funcionará
fuente
Luego seleccione
no
.fuente
Sintetizar a partir de las otras respuestas:
pushd
es específico de bash y está utilizando otro shell POSIX. Hay una solución alternativa simple para usar un shell separado para la parte que necesita un directorio diferente, así que intente cambiarlo a:(Reemplacé la ruta larga con una expansión variable. Probablemente sea una en el archivo MAKE y claramente se expanda al directorio actual).
Dado que lo está ejecutando desde make, probablemente también reemplazaría la prueba con una regla de make. Sólo
(eliminó el prefijo del directorio actual; de todos modos, estaba usando una ruta relativa en algunos puntos) Y luego haga que la regla dependa de
gen/SvcGenLog
. Sería un poco más fácil de leer y que puede hacer que dependen de lagenscript/genmakefile.pl
demasiado, por lo que elMakefile
engen
se regenerará si modifica la secuencia de comandos. Por supuesto, si algo más afecta el contenido delMakefile
, puede hacer que la regla también dependa de eso.fuente
Tenga en cuenta que cada línea ejecutada por un archivo make se ejecuta en su propio shell de todos modos. Si cambia de directorio, no afectará a las líneas siguientes. Así que probablemente tenga poco uso para pushd y popd, su problema es más el opuesto, ¡el de hacer que el directorio permanezca cambiado durante el tiempo que lo necesite!
fuente
Ejecute "apt install bash" Instalará todo lo que necesita y el comando funcionará
fuente
aquí hay un método para señalar
sh -> bash
ejecutar este comando en la terminal
Después de esto deberías ver
apuntar a / bin / bash (y no a / bin / dash)
Referencia
fuente
Esto debería hacer el truco:
Los paréntesis inician un nuevo shell secundario, por lo que
cd
cambia el directorio solo dentro del niño, y cualquier comando después de él dentro del paréntesis se ejecutará en esa carpeta. Una vez que salga del paréntesis, volverá a estar donde estaba antes.fuente