я могу заставить оболочку решать ls или меньше в зависимости от типа файла?

xdg-пантомима является частью набора сценариев, названных xdg-utils, "ряд единых интерфейсов для настольных сред (DE)". В Вашем особом случае я просто заключу комментарий MestreLion в кавычки отсюда:

Если у Вас нет настольной среды, Вы не должны использовать xdg-пантомиму (или никакой другой xdg инструмент). xdg предназначен для обеспечения совместимости между различными настольными средами, но не, когда нет ни одного. Думайте о xdg как о настольном агностике, но не "настольном атеисте"

Относительно внутренней механики xdg-utils... Они - просто проверка сценариев оболочки DE и, ЕСЛИ найдено, называя что инструменты файла конкретного DE для выполнения определенной задачи. В GNOME xdg-прослушивания gvfs-открываются и gvfs-информация о вызовах xdg-пантомимы (оба gvfs -* инструменты, дающие предпочтение решению расширением файла). В Вашем случае никакой DE не найден так, xdg-пантомима отступает к file[1] получить информацию о типе контента файла. Вот секция кода от xdg-пантомимы для "универсального" DE (или довольно неизвестна):

info_generic() {
DEBUG 1 "Running file -i \"$1\""
/usr/bin/file -i "$1" 2> /dev/null | cut -d ":" -f 2 | sed s/"^ "//

if [ $? -eq 0 ]; then
    exit_success
else
    exit_failure_operation_failed
fi }

Хотя это верно file[1] результаты не всегда на 100% точны, нет очень, можно сделать о том (это - все еще лучший инструмент для этого задания IMO). Однако, если Вы хотите определить типы пантомимы, базирующиеся только на расширениях файлов (а-ля окна), Вы могли записать свой собственный сценарий. Вот простой пример Python:

#!/usr/bin/python2

import os
import sys
import mimetypes

if len(sys.argv) != 2:
    print ("Usage: ./pymime filename")
    raise SystemExit

testfile = os.path.abspath(sys.argv[1])
mt = mimetypes.guess_type(testfile, strict=True)[0]
print ("%s" % mt)
sys.exit(0)

Назовите это pymime и работайте:

./pymime yourfile

3
03.01.2014, 03:17
2 ответа

Меньше может определить, дали ли этому каталог. Установите LESSOPEN переменная среды к ~/bin/LESSPIPE и сделайте ~/bin/LESSPIPE сценарий как следующее:

#!/bin/sh
if [ -d "$1" ]; then
  exec /bin/ls -la "$1"
elif [ -f "$1" ]; then
  case "$1" in
    *.tar|ztar) exec tar tvvf "$1" 2>/dev/null;;
    *.tar.[dg]z|*.tar.z|*.tgz) exec gzip -dc "$1" | tar tvvf - 2>/dev/null;;
    *.tar.bz2) exec bzip2 -d <"$1" 2>/dev/null | exec tar tvvf - 2>/dev/null;;
    *.tar.Z|*.taz) exec uncompress -c "$1" | exec tar tvvf - 2>/dev/null;;
    *.zip) exec unzip -l "$1" 2>/dev/null;;
    *.lha) exec lha -v "$1" 2>/dev/null;;
    *.7z) exec 7z l "$1" 2>/dev/null;;
    *.[rs]pm) exec rpm -qilp "$1";;
    *.z|*.[dg]z) exec gzip -dc "$1" 2>/dev/null;;
    *.bz2) exec bzip2 -dc "$1";;
    *.xz) exec xz -dc "$1";;
    *.Z) exec uncompress -c "$1" 2>/dev/null;;
  esac
fi

Вы получите список для каталогов и архивов.

Можно использовать lesskey вместо переменной среды для установки препроцессора. См. документацию для деталей.

5
27.01.2020, 21:07
  • 1
    я заставил это работать над человечностью 12.04 путем выполнения LESSOPEN экспорта = "| ~/bin/LESSPIPE %s". Это делает точно, что я хочу и намного более полезный материал. –  Philip Clarke 04.01.2014, 02:15

В ударе Вы могли легко создать функцию, чтобы сделать это:

function less_ls()
{
  # True if file exists and is a regular file.
  if [ -f "${1}" ]
  then
    less "${1}"
  else
    ls "${1}"
  fi
}

Очевидно, можно переименовать функцию в то, что Вы хотите путем замены less_ls часть, если Вы называете его less это будет иметь приоритет исполняемого файла less. Если Вы хотите, чтобы это было определено автоматически каждый раз, когда Вы запускаете Bash, который Вы могли бы скопировать, вставляют его в Ваш ~/.bashrc файл.

15
27.01.2020, 21:07
  • 1
    Или OP мог использовать правильные команды... +1 для обходного решения. –  ewwhite 02.01.2014, 17:32
  • 2
    Несомненно, он мог, но он говорит, что не хочет. Не мое дело говорить людям, что они должны предпочесть. –  replay 02.01.2014, 17:32

Теги

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