Cree otro acceso directo `~~` como `~` (directorio de inicio)

10

Quiero ~~apuntar a un directorio diferente para poder usarlo como acceso directo. Quiero que tenga exactamente las mismas funcionalidades que ~. ¿Cómo puedo hacer esto?

VarunAgw
fuente
2
Puede que esté mejor con los directorios
Michael Mrozek
Acaba de encontrar una solución interesante al problema superuser.com/a/565825/398328
VarunAgw
1
@ VarunAgw jaja, hallazgo divertido, justo como había pensado en la misma solución. Vergüenza. Pensé que era una mariposa única por un minuto :(
Gravy

Respuestas:

14

En realidad, hay una manera, no es una gran manera, pero es una forma, ¡jaja!

Agregue lo siguiente a su /etc/passwdarchivo:

~:x:1111:99:special Character user:/test:/sbin/nologin

reemplace 1111como el UID con algo que tenga sentido, reemplace /testcon el directorio que desea imitar ~~.

99en mi sistema es el nobodygrupo que recomiendo si haces esto para asegurarte de que sea un grupo sin permisos en cualquier archivo que alguna vez se use. Teóricamente con /sbin/nologinel shell, no debería poder usarse, tampoco tendrá una /etc/shadowentrada, por lo que no tendrá una contraseña. Teóricamente debería estar bien, pero asegúrese de que de alguna manera no le permita iniciar sesión como la cuenta.

Como nota al margen: no estoy diciendo de ninguna manera que esta sea una buena idea, pero logrará la funcionalidad que desea.

EDIT: Para completarlo esto fue sugerido por VarunAgw: Se podría añadir el usuario de forma normal con useradd -s /sbin/nologin -N tmpy luego modificar /etc/passwdy /etc/shadowcambiar el usuario tmpa ~y cambiar la ubicación de lahome directory

Salsa
fuente
En lugar de cambiar UID y GID, podemos simplemente useradd 'tmp'y luego reemplazar tmpcon~
VarunAgw
Cierto. buena sugerencia. No estoy seguro de cómo me siento al legitimarlo con una shadowentrada, pero supongo que siempre que no se configure una contraseña no es realmente un riesgo adicional.
Salsa
8

Puede utilizar CDPATH y colocar un directorio literalmente nombrado ~~ en uno de sus componentes CDPATH.

Desde man bash(pero CDPATH está disponible incluso en sh)

La ruta de búsqueda para el comando cd. Esta es una lista de directorios separados por dos puntos en los que el shell busca los directorios de destino especificados por el comando cd. Un valor de muestra es ".: ~: / Usr".

Eso te permitirá hacer cd ~~.

Si desea hacer cosas como vi ~~/someFiledesde cualquier parte del árbol de directorios, entonces no tiene suerte si insiste ~~literalmente a menos que piratee su shell, sin embargo, puede usar variables o variables de entorno para almacenar sus directorios mágicos para que pueda hacerlo , p.ej,$tilda/someFile

Por lo general, pongo archivos a los que se accede a menudo dentro de directorios con nombres cortos en mi directorio de inicio para poder acceder a ellos con rutas como ~/bo ~/l.

Naturalmente, generalmente puede reemplazar directorios con enlaces simbólicos a directorios tanto como desee.

PSkocik
fuente
1

La ~expansión de tilde del shell es principalmente programable. Se expande al directorio de usuarios del nombre de usuario del sistema declarado en su contexto final (y ya se ha ofrecido una excelente solución en este sentido) , el valor de la $HOMEvariable de shell, o no se ofrece en absoluto.

Entonces:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Lo cambio $HOMEtodo el tiempo y mantengo una función en el archivo de entorno de mi shell para restablecerlo:

home(){
    HOME=~$USER
    cd ~; pwd
}

Si desea utilizar la ~tilde de alguna manera que no se refiera a su directorio de inicio, hágalo . Solo reasignar $HOME. No tengas miedo de eso. $HOMEes solo una variable de shell como cualquier otra.


Otra sugerencia que tengo es solo una ligera expansión de los excelentes consejos de @ PSkocik sobre el uso $CDPATH. Sin embargo, una cosa que no mencionó es que puede usar y modificar en $CDPATHlínea sin cambiar el valor de shell actual $CDPATH. Por ejemplo:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdes necesariamente una construcción de shell, pero no es una construcción de shell especial POSIX , por lo que declarar el valor de $CDPATHno afecta a su valor de shell actual. Si lo usa como lo hice anteriormente $CDPATH, el valor solo se modifica para el entorno del cdcomando único , y luego se restaura a su valor anterior. Tiendo a encontrar la técnica anterior más útil cuando se usa en combinación con la finalización del historial. Haré lo anterior, cambiaré a un directorio, ejecutaré algunos comandos, luego presionaré hasta que regrese a mi cdcomando y retroceda un segmento de ruta o dos para moverme a otro lugar.


Ahora, si combina estos dos conceptos, puede hacer que un comando utilizado anteriormente signifique algo completamente diferente la próxima vez que lo use.

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2
mikeserv
fuente
0

Funciona perfectamente bien como una función bash:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

Aquí hay otro enfoque que se acerca un poco (sé que no me estoy acercando tanto a los requisitos)

function ~~ { echo /test; }

Luego con un par de personajes más:

cd `~~`/subdir
vi `~~`/file
Glenn Jackman
fuente
2
Bueno, cd ~~/foo/barno va a funcionar tan bien, o vim ~~/foo.txtetc ...
derobert
1
La pregunta no está clara. Si ese es el uso deseado, usaría la CDPATHvariable para manejar el cdcaso.
Glenn Jackman
Estoy de acuerdo en que no está completamente claro, pero OP pide que funcione como ~. Y ~no se usa como un comando.
derobert
Lo encontré bastante comprensible, si no completamente explicado. El problema CDPATHes que no funciona para comandos fuera de ... CD. IE puedes cd ~~o cd ~~/testdir1no puedesvim ~~testdir1
Gravy
podrías hacerlo mejor con un alias que llame a una función. comoalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv