Ядро не обрабатывает монтирование привязки, отличное от нормального монтирования после факт. Единственное отличие состоит в том, что происходит во время работы mount
.
Когда вы монтируете файловую систему (например, с помощью mount -t ext4 / dev / sda1 / mnt
), ядро (немного упрощенное) выполняет три шага:
-t
или используете -t auto
mount
угадывает тип за вас и предоставляет предполагаемый тип ядру) nodev
, например, опция в точке монтирования, а не в файловой системе. У вас может быть монтирование с привязкой с nodev
и без него) Если вы выполняете монтирование с привязкой ( например, с mount --bind / a / b
) происходит следующее:
(Я пропущу mount --move
, потому что это не имеет отношения к вопросу.)
Это очень похоже на то, как файлы создаются в Linux:
Если вы сделаете жесткую ссылку, произойдет следующее:
Как видите, созданный файл и жесткая ссылка неотличимы:
$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second
Но , поскольку вы можете идентифицировать все жесткие ссылки на файл, сравнивая номера inode, вы можете идентифицировать все подключения к файловой системе с помощью сравнивая старшее: младшее количество маунтов.
Вы можете сделать это с помощью findmnt -o TARGET, MAJ: MIN
или напрямую посмотрев на / proc / self / mountinfo
( подробнее см. В документации ядра Linux информация ).
Следующий скрипт Python перечисляет все привязки. Предполагается, что самая старая точка монтирования с кратчайшим относительным путем к корню смонтированной файловой системы является исходной точкой монтирования.
#!/usr/bin/python3
import os.path, re
from collections import namedtuple
MountInfo = namedtuple('MountInfo', ['mountid', 'parentid', 'devid', 'root', 'mountpoint', 'mountoptions', 'extra', 'fstype', 'source', 'fsoptions'])
mounts = {}
def unescape(string):
return re.sub(r'\\([0-7]{3})', (lambda m: chr(int(m.group(1), 8))), string)
with open('/proc/self/mountinfo', 'r') as f:
for line in f:
# Parse line
mid, pid, devid, root, mp, mopt, *tail = line.rstrip().split(' ')
extra = []
for item in tail:
if item != '-':
extra.append(item)
else:
break
fstype, src, fsopt = tail[len(extra)+1:]
# Save mount info
mount = MountInfo(int(mid), int(pid), devid, unescape(root), unescape(mp), mopt, extra, fstype, unescape(src), fsopt)
mounts.setdefault(devid, []).append(mount)
for devid, mnts in mounts.items():
# Skip single mounts
if len(mnts) <= 1:
continue
# Sort list to get the first mount of the device's root dir (if still mounted)
mnts.sort(key=lambda x: x.root)
src, *binds = mnts
# Print bind mounts
for bindmount in binds:
if src.root == bindmount.root:
srcstring = src.mountpoint
else:
srcstring = src.mountpoint+':/'+os.path.relpath(bindmount.root, src.root)
print('{0} -> {1.mountpoint} ({1.mountoptions})'.format(srcstring, bindmount))
Поскольку git
является псевдонимом , оканчивающимся пробелом, bash выполняет раскрытие псевдонима для слова сразу после него:
$ alias mv='mv -i'
$ alias git=': git '
$ set -x
$ git mv
+ : git mv -i
Из документов:
Если последний символ значения псевдонима является пробелом, то следующий Командное слово, следующее за псевдонимом, также проверяется на расширение псевдонима.
Сделайте git
псевдонимом без пробела:
alias git='LANG=en_US git'
Обратите внимание, что:
Первое слово замещающего текста проверяется на псевдонимы, но слово, идентичное раскрываемому псевдониму, не раскрывается второй раз. Это означает, что можно использовать псевдоним
ls
дляls -F
, для instance, и Bash не пытается рекурсивно расширять замену текст.
Итак, вам не нужно \git
.