Вывести путь к программе и ее символическую ссылку, используя которую - PullRequest
2 голосов
/ 23 марта 2020

Всякий раз, когда я использую which, я делаю это: $ which -a npm

Что приводит к: /usr/local/bin/npm

Затем, чтобы найти реальный путь, я запускаю: ls -l /usr/local/bin/npm

Я бы хотел быстрый способ сделать это. Лучшее, что я придумал, - это определение функции:

which(){
  /usr/bin/which -a "$@" | xargs ls -l | tr -s ' ' | cut -d ' ' -f 9-
}

Теперь она имеет хороший результат: /usr/local/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js

Есть ли лучший способ сделать это? Мне не нравится использовать такой крой.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

awk: если первый символ - «l» (ссылка), выведите поля 9,10,11; только только 9.

[ranga@garuda ~]$ ls -l $(which -a firefox)|awk '{print $1 ~ /^l/ ? $9 $10 $11 : $9 }'
/usr/bin/firefox->/usr/lib64/firefox/firefox
  • $1 - это первое поле
  • $1 ~ /^l/ ? проверяет, соответствует ли первое поле шаблону ^l (первый символ - «l» )
  • если тест пройден, print получает $9 $10 $11; иначе, только $9.

sed: удалить первые 8 групп символов без пробелов и пробелов.

[ranga@garuda ~]$ ls -l $(which firefox) | sed 's/^\([^ ]*[ ]*\)\{8\}//'
/usr/bin/firefox -> /usr/lib/firefox/firefox
  • [ ]* соответствует пачке непрерывные пробелы
  • [^ ]* соответствуют непрерывной группе непробельных символов
  • группировка \([^ ]*[ ]*\) соответствует тексту с одной непробельной группой и одним пробельным группой (в этом порядке).
  • \{8\} соответствует 8 смежным экземплярам этой комбинации. ^ в начале прикрепляет совпадение к началу строки.
  • 's/^\([^ ]*[ ]*\)\{8\}//' заменяет совпадение пустым текстом - фактически удаляя его.

, кажется, работает так долго поскольку вы не запускаете «which» для псевдонима.

эти команды не представлены внутри функции, но могут использоваться в одной (которую вы уже знаете, как).

0 голосов
/ 23 марта 2020

Это не напечатает вывод ->, который делает ls -l, но разрешит символические ссылки:

which() {
    command which -a "$@" | xargs -d '\n' readlink -m
}

Если вы хотите вывод ->, но хотите сделать это более надежно, вы Мог бы mimi c ls -l с:

which() {
    command which -a "$@" | while IFS= read -r file; do
        if [[ -L $file ]]; then
            echo "$file -> $(readlink -m "$file")"
        else
            echo "$file"
        fi
    done
}

Что делает command?

command подавляет поиск функции и запускает встроенную which команда, как если бы which() не была определена. Таким образом, вам не нужно жестко кодировать /usr/bin/which.

...