Как проверить повторяющиеся команды в $PATH?

Настройка переадресации X11 для каждого хоста

В дополнение ко всем превосходным ответам, уже приведенным здесь, вы можете настроить ForwardX11для каждого хоста, поэтому, если только serverне работает, вы можете добавить запись в свой файл ~/.ssh/configследующего форма:

Host server server.domain.dom
    ForwardX11 no

Вы даже можете использовать подобные записи в качестве псевдонимов для целых наборов конфигураций

Host my.server
    HostName server.domain.dom
    User user
    Port 1234
    ForwardX11 no

Это особенно полезно, если вы настроили Автозаполнение имен серверов для SSH и SCP .

0
04.01.2021, 17:12
3 ответа

В интерактивном режиме я бы использовал:

ls -l $(type -ap youtube-dl)

, чтобы найти расположение и временные метки всех youtube-dlпрограмм в моем $PATH.

Конечно, это не работает для исполняемых файлов, в именах которых есть пробелы, но youtube-dlне является одним из них.

2
18.03.2021, 22:38

Следующий сценарий выведет список повторяющихся исполняемых файлов, найденных в каталогах, перечисленных в переменной $PATH.

Для этого создается вкладка -, разделенная двумя -столбцами списка исполняемых файлов, где первый столбец — путь к каталогу, а второй — имя файла исполняемого файла.

Этот список считывается простой awkпрограммой, которая подсчитывает количество найденных исполняемых файлов и собирает все пути к каталогам для каждого из них в строку -с разделителями табуляцией.

В конце код awkвыводит каждый исполняемый файл, точное имя которого было найдено более одного раза, вместе со списком путей каталогов, разделенных табуляцией -, где он был найден. Каталоги будут перечислены в том порядке, в котором они были найдены, т. е. исполняемый файл будет выбран из первого каталога в списке, если он используется без явного пути в командной строке (с учетом текущего значения$PATH).

#!/bin/sh

# turn off filename globbing, and
# split strings in unquoted variables on colons
set -f; IFS=:

# set the positional parameters to the list of
# directories in the PATH variable
set -- $PATH

# turn on filename globbing again
# (leave IFS as is, it won't affect anything else here)
set +f

# loop over those directories and do the things
for dir do
        for pathname in "$dir"/*; do
                [ -x "$pathname" ] && printf '%s\t%s\n' "$dir" "${pathname##*/}"
        done
done |
awk -F '\t' '
{
        dir[$2] = ( dir[$2] == "" ? $1 : dir[$2] "\t" $1 )
        count[$2]++
}
END {
        for (util in dir)
                if (count[util] > 1)
                        printf "%s\t%s\n", util, dir[util]
}'

Пример запуска в моей системе OpenBSD, передача вывода через column -tдля его правильного форматирования и сортировка:

$ sh script | column -t | sort
banner       /usr/bin                /usr/games
bash         /home/myself/local/bin  /usr/local/bin
bashbug      /home/myself/local/bin  /usr/local/bin
chgrp        /bin                    /usr/sbin
chown        /usr/sbin               /sbin
clang        /usr/bin                /usr/local/bin
clang++      /usr/bin                /usr/local/bin
clang-cpp    /usr/bin                /usr/local/bin
ld.lld       /usr/bin                /usr/local/bin
llvm-config  /usr/bin                /usr/local/bin
python3      /home/myself/local/bin  /usr/local/bin
python3.8    /home/myself/local/bin  /usr/local/bin
sysctl       /usr/sbin               /sbin
zsh          /home/myself/local/bin  /usr/local/bin

Вывод говорит мне, что если я запущу bashв командной строке, он будет выбран из /home/myself/local/bin, и что у меня есть еще один исполняемый файл bashв /usr/local/bin.

0
18.03.2021, 22:38

Чтобы просмотреть каталоги PATH по порядку и перечислить расположение файлов, которые будут выполняться, вы можете использовать команду which:

$ which -a command_name
0
18.03.2021, 22:38

Теги

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