В дополнение ко всем превосходным ответам, уже приведенным здесь, вы можете настроить 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 .
В интерактивном режиме я бы использовал:
ls -l $(type -ap youtube-dl)
, чтобы найти расположение и временные метки всех youtube-dl
программ в моем $PATH.
Конечно, это не работает для исполняемых файлов, в именах которых есть пробелы, но youtube-dl
не является одним из них.
Следующий сценарий выведет список повторяющихся исполняемых файлов, найденных в каталогах, перечисленных в переменной $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
.
Чтобы просмотреть каталоги PATH по порядку и перечислить расположение файлов, которые будут выполняться, вы можете использовать команду which
:
$ which -a command_name