pwd
me da
/data/users/me/some/random/folder
¿Hay una manera fácil de obtener
~/some/random/folder
de pwd
?
pwd
. De lo contrario, romperá los scripts que esperan usar su salida en contextos que no realizan una expansión de tilde.
pwd
me da
/data/users/me/some/random/folder
¿Hay una manera fácil de obtener
~/some/random/folder
de pwd
?
pwd
. De lo contrario, romperá los scripts que esperan usar su salida en contextos que no realizan una expansión de tilde.
Respuestas:
Si está usando bash, entonces el dirs
incorporado tiene el comportamiento deseado:
dirs +0
~/some/random/folder
(Nota +0
, no-0
)
Con zsh
:
dirs
~/some/random/folder
Para ser exactos, primero necesitamos borrar la pila del directorio, de lo contrario dirs
imprimiríamos todos los contenidos:
dirs -c; dirs
O con zsh
el print
incorporado:
print -rD $PWD
o
print -P %~
(ese activa la expansión rápida . %~
in se $PS1
expande al directorio actual con $HOME
reemplazado por ~
pero también maneja otros directorios con nombre como el directorio de inicio de otros usuarios o directorios con nombre que usted define).
Puede usar la función de reemplazo de subcadena variable Bash:
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
ksh
y zsh
.
${string/#substring/replacement}
versión para evitar este comportamiento.
echo
) en zsh
. En otros shells, se $HOME
trataría como un patrón y todo estaría sujeto a split + glob.
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
Utilizando sed
:
pwd | sed "s|^$HOME|~|"
La idea es utilizar cualquier carácter que sea menos probable que aparezca en una ruta de directorio de inicio como delimitador en sed
regex. En el ejemplo anterior que estoy usando |
.
Lo bueno de esta técnica es que en realidad es independiente de la shell.
También puede usar el alias pwd
para /bin/pwd | sed "s|$HOME|~|"
obtener este comportamiento en otros scripts que podrían estar utilizando pwd
.
^
ancla en su expresión regular. De lo contrario, es posible (aunque poco probable) que esto reemplace un segmento en el medio del camino.
"s|^/home/user\(/.*\)\?$|~\1|"
. De lo contrario, coincide con los caminos de otros usuarios si sus nombres son como user1
, user2
, user3
y que coincide simplementeuser
tilde=\~${PWD#~}
Creo que eso es lo que quieres?
Lo bueno de la tilde es cuando se expande como un patrón que no necesita ser citado. Si se usa $HOME
de la misma manera sin comillas, se obtendrían resultados impredecibles porque cualquiera de sus caracteres constituyentes podrían ser caracteres de patrón, por lo que no siempre se generaría el resultado esperado.
Pero se espera que la expansión de tilde siempre ocurra como si fuera el resultado de una expansión citada, por lo que sus resultados son predecibles. Esto parece ser cierto en prácticamente todos los shell que he probado para case
patrones y patrones de parámetros con las notables excepciones de ambos ksh93
y mksh
por cualquier motivo, ninguno de los cuales parece honrar el aspecto citado de la tilde en esa capacidad.
Otra cosa interesante de esto es que puede redefinir $HOME
para manejar cualquier directorio de la misma manera. Por ejemplo:
cd ~
HOME=/some/prefix/I/would/like/to/trim
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD
Aquí hay otro ejemplo:
set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
HOME=${*#~/}/$d
set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~
$PWD
está debajo $HOME
. Puede usar la misma idea combinada con la sustitución de patrones para hacerlo más general. ¿Cómo está ${PWD/#~/\~}
?
Puede intentar reemplazar la parte no deseada con sed
:
pwd | sed 's,^/data/users/me,~,'
o mejor:
pwd | sed "s,^$HOME,~,"
^
ancla para asegurarse de que solo se reemplacen las coincidencias al comienzo de la ruta del directorio. Además, no necesita usarlo g
porque el comando debería reemplazar 1 ocurrencia como máximo.
/home/alice
y mi directorio actual es /home/aliceinchains
. Pero si la única vez que quiero usar la función es cuando sé que soy mi directorio personal o uno de sus subdirectorios, entonces debería funcionar.