basicos - comandos shell linux
bash-cómo canalizar el resultado del comando which to cd (7)
¡No necesita un tubo, puede hacer lo que quiera usando la expansión del parámetro Bash!
Sugerencia adicional: utilice "tipo -P" en lugar del comando "que" externo si está utilizando Bash.
# test
touch /ls
chmod +x /ls
cmd=''ls''
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
echo "No such program in PATH search directories: ${cmd}"
exit 1
fi
¿Cómo podría canalizar el resultado de un comando para cd
?
Esto es lo que intento hacer:
which oracle | cd
cd < which oracle
Pero ninguno de ellos funciona.
¿Hay alguna manera de lograr esto (en lugar de copiar / pegar, por supuesto)?
Editar: pensándolo bien, este comando fallaría, porque el archivo de destino NO es una carpeta / directorio .
Así que estoy pensando y buscando una mejor manera de deshacerme de la parte final "/ oracle" ahora (sed o awk, o incluso Perl) :)
Editar: Bueno, eso es lo que tengo al final:
cd `which oracle | sed ''s///oracle//g''`
Además de la buena respuesta anterior, una cosa que hay que mencionar es que el CD es un shell incorporado, que se ejecuta en el mismo proceso que no sea nuevo como ls, que es un comando.
Con dirname para obtener el directorio:
cd $(which oracle | xargs dirname)
EDITAR: tenga cuidado con las rutas que contienen espacios, vea el comentario de @anishpatel a continuación
En respuesta a su pregunta editada, puede quitar el nombre del comando utilizando dirname
:
cd $(dirname `which oracle`)
OK, aquí una solución que usa citas correctas:
cd "$(dirname "$(which oracle)")"
Evite los backticks, son menos legibles y siempre cite las sustituciones de procesos.
Utiliza tubería en los casos en que el comando espera parámetros de la entrada estándar. ( Más sobre esto ).
Con el comando cd
ese no es el caso. El directorio es el argumento del comando. En tal caso, puede usar la sustitución de comando. Use palos o $(...)
para evaluar el comando, almacenarlo en variable ..
path=`which oracle`
echo $path # just for debug
cd $path
aunque se puede hacer de una manera mucho más simple:
cd `which oracle`
o si tu camino tiene caracteres especiales
cd "`which oracle`"
o
cd $(which oracle)
que es equivalente a la notación de retroceso, pero se recomienda (los backticks se pueden confundir con apóstrofes)
.. pero parece que quieres:
cd $(dirname $(which oracle))
(lo que le muestra que puede usar el anidamiento fácilmente)
$(...)
(y también backticks) funcionan también en cadenas de comillas dobles, lo que ayuda cuando el resultado puede contener espacios.
cd "$(dirname "$(which oracle)")"
(Tenga en cuenta que ambas salidas requieren un conjunto de comillas dobles).
cd `which oracle`
Tenga en cuenta que estos son marcadores (generalmente la clave a la izquierda de 1 en un teclado de EE. UU.)