У ln неожиданное поведение при использовании подстановочного знака
Я планирую подать ошибку на coreutils для этого, так как это поведение неожиданно, и в реальном мире для него нет никакой практической пользы... Хотя поначалу я действительно смеялся, потому что я даже не знал ни одного может создавать файлы с подстановочными знаками в имени файла. Насколько практично имя файла с подстановочным знаком? Кто вообще использует такую функцию?
Я недавно выполнил команду bash, подобную этой:
ln -s ../../avatars/* ./
К сожалению, я не добавил правильное количество "../", поэтому вместо предоставления информативной ошибки он просто создает ссылку на файл "*", который не существует. Я ожидаю, что это сделать это:
ln -s "../../avatars/*" ./
Так как это правильный способ обращения к такому имени файла.
Перед тем как отправить сообщение об ошибке в coreutils, я хотел бы узнать мнение других. Есть ли практическое применение этому поведению, или я должен предоставить значимое сообщение об ошибке?
И да, я знаю, что можно просто ссылаться на весь каталог, а не на каждый файл внутри, но я не хочу, чтобы вновь созданные файлы были скопированы в старое местоположение. Там только несколько файлов, которые сейчас связаны.
Некоторые могут даже сказать, что использование подстановочных знаков в символических ссылках - плохая практика. Тем не менее, я точно знаю содержимое каталога, и это гораздо быстрее, чем вручную делать каждый файл.
1 ответ
Это не ошибка.
В оболочке, если вы используете шаблон с подстановочными знаками, который ничего не соответствует, шаблон не подставляется. Например, если вы делаете это:
echo *.c
Если в текущем каталоге нет файлов.c, он просто выведет "*.c". Если в текущем каталоге есть файлы.c, то *.c будет заменен этим списком.
Для многих команд, если вы укажете несуществующие файлы, это ошибка, и вы получите сообщение, которое, кажется, имеет смысл, например, "не может получить доступ к *.c". Но для ln -s, поскольку это символическая ссылка, сам файл не должен существовать, и он идет дальше и создает ссылку.