Отсутствующие операнды - команда rm

Считаются ли жесткие ссылки обычными файлами?

Жесткие ссылки считаются тем, на что они ссылаются. Вы можете ссылаться на что угодно в той же файловой системе.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Каждая жесткая ссылка на что-либо эквивалентна, базовый объект остается здесь до тех пор, пока на него есть любая (edit: несимволическая) ссылка (даже открытый дескриптор файла, за что у меня есть неловкая причина быть очень благодарным).

Система будет соблюдать правила в отношении ссылок на директории, вы получаете одну именованную ссылку на директорию, и система автоматически добавляет ее встроенную ссылку и все подкаталоги. (обратите внимание, что . в приведенном выше ls'е имеет две ссылки), но это явная проверка, в некоторых модифицированных системах привилегированные пользователи, которые обещают не делать циклов, могут сами добавлять новые ссылки. Файловую систему это не волнует, она может прекрасно представлять произвольные графы каталогов, но никто не хочет иметь с ними дело.

Существует (множество не-unix) файловых систем, которые не работают таким образом, включая некоторые, которые называют то, что они предлагают в качестве замены, "жесткими ссылками". OS X, если я правильно помню, придумала эквивалент для HFS+ (которая не имеет их изначально), но я не знаю, насколько точно она сохраняет семантику здесь.

0
23.02.2018, 23:03
1 ответ

Debido a que tiene shopt -s nullglob, el comando rm $rDir/$deviceName*se expande a solo rmcuando el patrón global coincide nada.

En efecto,llamar rmsin parámetros da como resultado el mensaje que vio:

$ rm
rm: missing operand
Try `rm --help' for more information.

Contrasta estos dos:

$ rm nonexistent*
rm: cannot remove `nonexistent*': No such file or directory

$ (shopt -s nullglob; rm nonexistent*)
rm: missing operand
Try `rm --help' for more information.

Una forma simple e insegura de silenciar errores de rmen parámetros faltantes sería llamarlo como rm -f.

Tenga en cuenta que probablemente sería mucho mejor, en cambio, evitar terminar en una situación en la que se llama a rmcon un parámetro creado a partir de variables no configuradas en primer lugar:set -o nounsetprohibirá el uso de variables no configuradas (pero no hará nada con las variables establecidas en la cadena vacía ), por ejemplo; si tuviera que hacer rm $x/$y*con ambas variables sin configurar o vacías, el parámetro se convertiría en /*, es decir, todos los archivos directamente en el directorio raíz.

6
28.01.2020, 02:15

Теги

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