Невозможно запустить одну конкретную программу из терминала без использования полного пути

9

Я хочу запустить программу ds9из Терминала. Программа явно находится в PATH, который я определил, запустив:

which ds9
/Users/evgenii/miniconda3/envs/iraf/bin/ds9

Но когда я запускаю команду, набирая ds9, она показывает мне следующую ошибку:

-bash: /Applications/ds9.app/Contents/MacOS/ds9: No such file or directory

Я все еще могу выполнить это нормально, если я использую полный путь следующим образом:

/Users/evgenii/miniconda3/envs/iraf/bin/ds9

В чем дело? Почему он пытается бежать /Applications/ds9.app?

Разрешения заключаются в следующем:

-rwxrwxr-x@ 1 evgenii  staff  18613852  9 Nov 20:13 /Users/evgenii/miniconda3/envs/iraf/bin/ds9

Обновить:

Вот результат выполнения type -a ds9команды:

type -a ds9
ds9 is aliased to `/Applications/ds9.app/Contents/MacOS/ds9 -xpa no'
ds9 is /Users/evgenii/miniconda3/envs/iraf/bin/ds9
Евгений
источник
4
Не используйте which. Это внешняя программа, поэтому она не может сказать об псевдонимах оболочки.
Бармар
Рецепт для работы с командами: используйте, PATHа не aliasи type, чем which.
дан

Ответы:

19

Команда явно имеет псевдоним для сломанного псевдонима. Во-первых, проверьте все совпадения ds9в PATHпеременной среды, выполнив следующую команду:

type -a ds9

Согласно вашему обновленному вопросу, из вывода type -a ds9команды видно , что псевдоним скрывает фактическую команду.

Чтобы выполнить фактическую команду, игнорируя псевдоним и не указывая полный путь, добавьте \перед командой символ обратной косой черты. Это игнорирует любой псевдоним, определенный в bash.

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

Нимеш Нима
источник
1
Определение ds9псевдонима, скорее всего, есть ~/.bashrcи должно быть там удалено (потому что это плохой метод, приводящий к такого рода проблемам). grep ds9 ~/.bashrcподтвердит это.
дан
4

Я вижу, что это было решено для спрашивающего, но для будущих читателей я хочу упомянуть, что это также может быть случай, когда команда была хеширована, а затем файл удален. (См. help hashДля информации.)

type -a commandnameне покажет вам, только type commandnameбудет.

В этом случае hash -d ds9будет все, что потребуется.

Wildcard
источник