Bash: путь или ссылка на строку в файле?

/path/to/fname#line1242 

Есть ли способ ссылаться на конкретный номер строки в файле как часть пути или каким-либо образом упаковать ссылку на номер строки, которая выглядит / ведет себя как путь? Например, передавая строку выше другому пользователю той же файловой системы, чтобы они могли легко открыть мой файл «fname» и сразу же войти в строку 1242.

Я думаю о поведении, аналогичном привязке HTML, которое может быть включено в строку с URI на страницу, а затем вести себя точно так же, как ссылки. А именно, они могут быть предоставлены другим пользователям одной и той же файловой системы и будут указывать данную строку в файле этим пользователям, открывая файл по умолчанию этой строке. Я понимаю, что в UNIX единственными вещами, которые действительно могут быть частью пути, могут быть каталоги, файлы и псевдофайлы. Но тогда есть globs, расширение строки и т. Д., Которые не являются строго частью пути, но могут быть помещены в один «удобно», в то время как имя файла передается и ссылается без каких-либо дополнительных команд. Есть ли встроенный способ моделирования поведения привязки / ссылки, как это для UNIX-файла?

Я мог бы включить подстановку команд в мой «путь» с помощью sed "1242p" и некоторую самосогласованность, но тогда я больше не имею дело с именем пути, а просто командой, работающей с файлом. Подумайте об этом, тогда я бы не связывался, просто извлекая линию. Я не могу придумать способ ссылки на определенную строку вообще (без игнорирования остальной части файла).

GNU bash, версия 3.2.51

4 Solutions collect form web for “Bash: путь или ссылка на строку в файле?”

Ну, вы можете создать URI для локального файла, например:

 file:///home/user/filename 

И затем вы можете вставить руководство № Part3:

 file:///home/user/filename#Part3 

но вам нужно, чтобы файл находился в html если браузер будет использоваться для чтения файла.


Тогда возникает реальный вопрос: какая программа (инструмент) должна читать (показывать) файл?

Ответ выше, если вы ожидаете, что браузер прочитает его.

Если вы используете less (обычный читатель man-страниц), вы можете направить меньше, чтобы перейти к определенной строке:

 less +20 filename 

Чтобы прочитать текстовый файл с номером строки 20 в начале консоли.

Если вы можете изменить имя файла, укажите номер строки.
Что-то вроде: filename-line-233 , это будет работать:

 $ filename=A-text-file-line-233 $ less +"${filename##*-}" "$filename" 

Могут быть другие инструменты, которые могут быть адаптированы к этой идее.

Действительно, нет способа связать часть файла. Ссылки – это инструменты на уровне файлов, они разрешают доступ к файлу под определенным именем, они ничего не делают с содержимым файла.

Если вы хотите читать только из файла, вы можете использовать именованный канал :

 mkfifo fname_line1242 while true; do sed -n '1242 { p; q; }' /path/to/fname >fname_line1242; done 

и тогда любой, кто читает fname_line1242 , получит строку 1242 из /path/to/fname … если повезет. Именованные каналы не имеют какой-либо формы синхронизации, поэтому это будет работать только надежно, если одновременно будет только один читатель.

Чтобы эта работа работала с несколькими читателями, вы можете использовать сокет и запустить socat для выполнения команды для создания контента каждый раз, когда сокет читается.

 socat -U UNIX-LISTEN:fname_line1242,unlink-early,fork EXEC:'sed -n -e 1242{ -ep -eq -e } /path/to/fname' 

Если вы хотите, чтобы записи в файл заменяли строку в /path/to/fname , это возможно, но значительно сложнее. Вы можете использовать FUSE для создания пользовательских файловых систем, где такие операции, как открытие файла, чтение, запись и т. Д., Выполняют код, который вы пишете. Это требует значительных усилий, если кто-то уже не написал файловую систему, которая делает то, что вы хотите.

Вы можете создать файл с именем +view +1242 fname . Затем вызов vi или view в этом файле:

 view '+view +1242 fname' 

откроет fname в view и поместит курсор в начало строки 1242 (здесь предполагается реализация vim vi / view ).

Или выполните:

 ln -s / '+view +1242 ' 

Итак, вы делаете:

 view '+view +1242 /etc/passwd' 

для просмотра /etc/passwd в строке 1242.

Или:

 touch '+exe "view +1242 \57etc\57passwd"' 

И view что с:

 view '+exe "view +1242 \57etc\57passwd"' 

Вы также можете сделать верхнюю строку целевого файла:

 #! /usr/bin/less +1242 

И сделайте его исполняемым ( chmod +x fname ) и запустите его, чтобы он был открытым less на 1242- й строке.

С уценкой вы, похоже, можете ссылаться на строки в файле:

github link

  • Создать ссылку между двумя существующими файлами
  • Сценарий разрешения FS
  • cp переписывание без перезаписи жестких ссылок на место назначения
  • Поиск всех жестких ссылок файла без прохождения файловой системы
  • Команда Linux для копирования как жесткие ссылки при удалении нежелательных файлов?
  • В чем разница между размером файла между символьными и жесткими ссылками?
  • Как скопировать каталоги с сохранением жестких ссылок?
  • Возможны ли жесткие ссылки для каталогов в файловых системах ext2 / 3/4?
  • Как вручную изменить индекс?
  • Есть ли инструмент для создания жесткой ссылки на несвязанный индексный дескриптор?
  • Где хранится информация о жестких / непрямых ссылках?
  • Interesting Posts

    Как я могу синтаксис выделить границы диапазона Ruby в gtksourceview3.0?

    Как использовать ESC-последовательности, чтобы сделать область прокрутки терминала

    hda-codec и hda-intel

    Поиск отсутствующего значения в текстовом файле

    Почему «make» жалуется на недостающее правило, когда я пытаюсь создать программу из источника?

    Можно ли использовать APT на TinyCore?

    Как использовать завершение команды bash, чтобы завершились только файлы в определенном каталоге?

    Почему мое регулярное выражение не работает в bash «if»?

    SSH аутентификация на основе ключа: known_hosts vs authorized_keys

    Является ли целью установить номер версии файла, используя chattr, подобный оптометрической блокировке в базе данных?

    Когда я буду использовать FBDEV против DRM против DSS?

    Я не могу создать fstab при установке arch

    script: записывать оба кода выхода и выхода

    У Busybox ASH внутри initrd есть проблема, когда трубопроводный тройник

    Как сканировать каталог с пробелом в его имени с помощью maldet

    Linux и Unix - лучшая ОС в мире.