Considera este guión.
#! /usr/bin/env bash
mkdir -p target
mkdir -p mydir/package/
touch mydir/package/file
ln --symbolic mydir mylink
file mylink
stow --verbose --dir=./mylink --target=./target package
file target/file
La salida es
mylink: symbolic link to mydir
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
Antes de correr stow
, se ve así:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
Después de correr stow
, mylink
esperaba que se viera así:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mylink/package/file
Sin embargo, en cambio se ve así:
.
├── mydir
│ └── package
│ └── file
├── mylink -> mydir
└── target
└── file -> ../mydir/package/file
Parece que el stow
comando resuelve la ruta real del directorio del paquete, por lo que en lugar de señalarlo ../mylink/package/file
, apunta ../mydir/package/file
.
Esto tiene sentido para evitar demasiada indirección, pero ocurre en silencio y puede no ser siempre deseable. ¿Hay alguna forma de evitar este comportamiento?
Editar: según la solicitud, describiré un caso de uso de ejemplo donde resolver la ruta real es inconveniente.
Los enlaces simbólicos a veces se usan por compatibilidad . Debian incluso habla de esto en la política oficial . A menudo, el destino es un solo archivo, pero a veces es un directorio
. Resulta que tengo unos pocos cientos en mi sistema /usr/share/doc/
solo:
$ find /usr/share/doc -xtype d -type l | wc -l
325
El comportamiento predeterminado de stow
está bien siempre que el objetivo del enlace simbólico no se mueva. Pero a veces el directorio deseado deseado se mueve. Por ejemplo, en Debian, el vim-runtime
paquete instala archivos en / usr / share / vim / en un directorio que depende de la versión, como la /usr/share/vim/vim64
versión 6.4. Sin embargo, el paquete también podría actualizar un enlace simbólico
al /usr/share/vim/vimcurrent
que apuntaban a la versión actual. Esto significa que un enlace simbólico que apunta a, digamos
/usr/share/vim/vim64/doc/cmdline.txt
se rompería cuando la próxima versión de Debian lo actualizara a
/usr/share/vim/vim70/doc/cmdline.txt
pero un enlace simbólico a
/usr/share/vim/vimcurrent/doc/cmdline.txt
funcionaría en ambas versiones.
Como stow
usa la ruta canónica absoluta del directorio de almacenamiento, una invocación como
stow --dir=/usr/share/vim/vimcurrent --target=./my-vim-docs doc
daría lugar a enlaces simbólicos como, por ejemplo, esto:
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vim64/doc/cmdline.txt
así no:
$ file cmdline.txt
cmdline.txt: symbolic link to ../../../../../usr/share/vim/vimcurrent/doc/cmdline.txt
(La motivación para usar stow
on vimcurrent/docs
es poder mezclar mis propias notas vim junto con enlaces simbólicos a la documentación actual). Tenga en cuenta que el vimcurrent
enlace simbólico de compatibilidad
ya no está presente en las distribuciones actuales de Debian ,
aunque puede estar en otros como Arch Linux ; No estoy seguro. En cualquier caso, aquí hay un script que da la idea general de la documentación de vim:
#! /usr/bin/env bash
mkdir -p target
ln --symbolic /usr/share/vim/vim80 vimcurrent
stow --verbose --dir=./vimcurrent --target=./target pack
file target/dist
Salida es:
LINK: dist => ../../../../../usr/share/vim/vim80/pack/dist
target/dist: symbolic link to ../../../../../usr/share/vim/vim80/pack/dist
Hipotéticamente, stow
podría tener una bandera llamada, por ejemplo --no-realpath
, para que la salida se vea así:
LINK: dist => ./vimcurrent/pack/dist
target/dist: symbolic link to ./vimcurrent/pack/dist
Para otros ejemplos de enlaces simbólicos de compatibilidad que cambian con cada versión, aquí hay dos más que conozco en mi computadora portátil:
$ file /usr/share/go
/usr/share/go: symbolic link to go-1.10
$ file /usr/share/mscore
/usr/share/mscore: symbolic link to mscore-2.1
Para abordar el caso de symlink-points-to-symlink:
#! /usr/bin/env bash
mkdir -p target
mkdir -p mydir/package/
touch mydir/package/file
ln --symbolic mydir mylink
ln --symbolic mylink mylink2
namei mylink2
produce:
f: mylink2
l mylink2 -> mylink
l mylink -> mydir
d mydir
y entonces:
$ stow --verbose --dir=./mylink2 --target=./target package
$ file target/file
produce:
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
mientras
$ stow --no-realpath --verbose --dir=./mylink2 --target=./target package
$ file target/file
produciría esto:
LINK: file => ../mylink2/package/file
target/file: symbolic link to ../mylink2/package/file
Entonces, en el --no-realpath
comportamiento hipotético , trataría el directorio de almacenamiento como un directorio regular.
Esta característica sería aplicable en un escenario donde
1) el directorio de almacenamiento tiene que ser un enlace simbólico, y
2) es deseable preservar ese enlace en los enlaces simbólicos generados.
Si bien no considero que la falta de esta característica sea una gran deficiencia stow
, espero que este ejemplo aclare la utilidad potencial de no siempre resolver caminos canónicos.
mylink
lugar de un enlace simbólico almylink2
que a su vez se vinculómydir
? ¿Cómo debe Stow decidir si se debe crear enlaces simbólicos que apuntan a../mylink/package/file
o../mylink2/package/file
o../mydir/package/file
?Respuestas:
Por ahora, no hay forma.
Internamente,
stow
encuentre la ruta canónica absoluta de la ruta dada usando chdir para moverse hacia la ruta, luego use la función getcwd () del módulo POSIX, que es la interfaz Perl para POSIX getcwd () , para obtener el nombre de ruta absoluta.Como POSIX especificó, el nombre de la ruta no contendrá componentes que sean
.
o..
, o sean enlaces simbólicos.fuente