Linux запрещает переименование любого пути, заканчивающегося в компоненте .
или ...
, возвращая ошибку EBUSY; также произойдет сбой:
$ mkdir a a/aa
$ mv a/aa/.. b
mv: cannot move ‘a/aa/..’ to ‘b/..’: Device or resource busy
Код для этого находится в namei.c::renameat
. Последний компонент пути при передаче в различные функции должен иметь тип LAST_NORM
, а не LAST_DOT
или LAST_DOTDOT
.
FreeBSD возвращает ошибку EINVAL в каждом из этих случаев.
Мы можем только догадываться, почему существует это ограничение.
Функция переименования() не будет работать, если:
. ...
[EBUSY] Каталог, названный старым или новым, в настоящее время используется системой или другим процессом, и реализация считает это ошибкой. Можно считать
.
, который в настоящее время используется процессом. Но обратите внимание, что Linux позволяет следующее, поэтому каталога, просто используемого каким-либо процессом, недостаточно для того, чтобы переименование
не прошло:
$ mkdir /tmp/t
$ cd /tmp/t
$ mv /tmp/t /tmp/t1
$ /bin/pwd
/tmp/t1
Причина, по которой запрещается переименование .
и .
, вероятно, "приводит к меньшей путанице пользователей".
.
, как правило, является жесткой связью с записью каталога в его родителе, и является несколько особенным в том, что процесс всегда может открыть .
для доступа к текущей рабочей директории. Возможность переименования было бы контрпродуктивным. ..
обычно является жесткой ссылкой на родителя директории, и несколько особенным в том, что процесс открывает ...
получит родительский каталог (или сам каталог, если это точка монтирования). Возможность переименования будет контрпродуктивной. Linux также запрещает rmdir
путь, последним компонентом которого является ...
(ENOTEMPTY) или .
(EINVAL). FreeBSD возвращает ошибку EINVAL для каждого из них.
Стандарт POSIX для rmdir имеет следующее:
Функция rmdir() не будет работать, если:
. ...
[EINVAL] Аргумент пути содержит последний компонент, который является точкой.
Если Вы имеете в виду, что хотите распечатать ряд строк, то Вы можете использовать этот sed -n 2,4p somefile.txt
. При этом будут выведены строки со 2 по 4 из somefile.txt
.
Печать строк от 2 до 4:
sed '2,4!d' file
Печать строки 2, и дополнительно 2 строки за ней:
sed '2,+2!d' file
с GNU SED
, вы можете печатать строки 2, 3, 10 и т. Д., Использование:
sed -n '2p;10p;3p;...'