Могу ли я создать одностороннюю символическую ссылку?

Мой любимый способ — использовать compgen -c. Например, чтобы найти все команды, содержащиеmount:

$ compgen -c | grep mount
gvfs-mount
mmount
ideviceimagemounter
grub-mount
humount
hmount
umount
mountpoint
mount
fusermount
umount
mount.ntfs
mount.lowntfs-3g
mount.cifs
umount.udisks
mount.nfs
umount.nfs
mount
mount.ntfs-3g
mount.fuse
showmount
rpc.mountd
mountesp
umount.udisks2
mountstats
automount

Что хорошо в compgen -c, так это то, что он также находит псевдонимы, пользовательские функции и встроенный Bash -в командах, например:

$ alias aoeuidhtn='echo hi'
$ compgen -c | grep aoeuidhtn
aoeuidhtn
$ my-great-function() { printf "Inside great function()\n"; }
$ compgen -c | grep great
my-great-function
$ compgen -c | grep '^cd$'
cd

Кроме того, compgenявляется частью Bash, поэтому он всегда доступен. Как описаноhelp compgen:

Display possible completions depending on the options.

Intended to be used from within a shell function generating possible completions.  If the optional WORD argument is supplied, matches against WORD are generated.

Exit Status:
Returns success unless an invalid option is supplied or an error occurs.

7
16.10.2019, 16:27
1 ответ

Все символические ссылки являются -односторонними. Что касается ядра, после входа в /D/S1и запуска chdir("ls2")вы попадаете в /D/S2, поэтому, если вы запустите chdir(".."), вы окажетесь в /D.

Если вы сделаете это в оболочке, после

cd /D/S1
cd ls2
cd..

вы попадаете в /D/S1. Причина в том, что оболочка самостоятельно отслеживает текущий каталог и запоминает символические ссылки.

Вы не можете отключить это поведение оболочки для ссылки -по ссылке -, но вы можете отключить ее при выполнении команды cd. После запуска cd ls2оболочка запоминает текущий каталог как /D/S1/ls2:

.
$ pwd
/D/S1
$ cd ls2
$ pwd
/D/S1/ls2
$ cd..
$ pwd
/D/S1

Чтобы заставить оболочку забыть свою символическую ссылку -с учетом отслеживания текущего каталога, передайте параметр -Pв cd. Команда pwdтакже имеет параметр -P.

$ pwd
/D/S1
$ cd ls2
$ pwd
/D/S1/ls2
$ pwd -P
/D/S2
$ cd -P..
$ pwd
/D

Вы также можете забыть о логическом отслеживании при переходе на символическую ссылку:

$ pwd
/D/S1
$ cd -P ls2
$ pwd
/D/S2
$ cd..
$ pwd
/D
21
27.01.2020, 20:14

Теги

Похожие вопросы