Специальные символы в bash

ddrescue успешно скопировал с диска с поврежденными секторами на тот, который был отключен из массива еще в ноябре, правда, только после того, как я заменил блок питания. В /var/log/kern.log я увидел сотни неудачных команд WRITE FDMA QUEUE, поэтому вытащил блок питания с более новой машины, и после пересадки ddrescue заработал нормально. Для дисков 4 ТБ ушло около 10 часов. Он сообщил о 15 ошибках общим объемом 80 КБ. После завершения sdd выглядел точно так же, как и sdc, как и следовало ожидать, поэтому я собрал массив с sdb sdd и sde, затем добавил sdd и позволил ему восстановиться, что завершилось без ошибок. Фактически, SMART больше не сообщает о поврежденных секторах на sdd. Я предполагаю, что это связано с тем, что запись в эти сектора привела к перераспределению секторов на диске. Так что все хорошо, просто нужно заказать новый блок питания.

0
07.05.2021, 15:14
2 ответа

Точка .не является специальным символом оболочки. Все свойства ссылок на каталоги .и ..касаются только структуры файловой системы, оболочка тут ни при чем. Обратите внимание, что даже там это не персонаж, а эти два конкретных имени. foo.txt, .barи ...являются обычными именами файлов, даже если имена, начинающиеся с точки, специально обрабатываются globs и ls.

С другой стороны, ~является обычным символом для файловой системы, но в оболочке Tilde Expansion обрабатывает его особым образом. Таким образом, ~без кавычек в начале слова расширяется до домашнего каталога текущего пользователя, а ~fooрасширяется до домашнего каталога пользователя foo.

(Конечно, оболочка знает о том, что такое .и .., в том смысле, что при запуске cd..из /tmpтекущий рабочий каталог отображается не как /tmp/.., а как /. Кроме того, в отличие от букв и _, точка недопустима в именах переменных, например. ,, %и -не являются.)

4
28.07.2021, 11:34

~как отдельный --, не заключенный в кавычки -, интерпретируется оболочкой как домашний каталог. Когда вы его цитируете, эта интерпретация прекращается, так что это не похоже на обычные переменные.

.и ..— ссылки в файловой системе.

Итак, если вы попытаетесь использовать .в программе на C (без оболочки ), это будет работать, как в:

#include <stdio.h>

int main(void) {
  DIR *d;
  struct dirent *dir;
  d = opendir(".");  /*<---------------See the. for current dir */
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }
    closedir(d);
  }
  return(0);
}

, тогда как если вы попробуете это с помощью ~, (d = opendir("~");), это не сработает.

1
28.07.2021, 11:34

Теги

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