Баш путь действует странно

211

Я пытаюсь запустить openscadиз командной строки, и он выдает ошибку, но если я наберу весь путь, по которому он работает, как показано ниже.

[dataproc@Euclid ~]$ which openscad /usr/bin/openscad [dataproc@Euclid ~]$ openscad bash: /usr/local/bin/openscad: No such file or directory [dataproc@Euclid ~]$ /usr/bin/openscad [dataproc@Euclid ~]$ #this worked 

Я совершенно не понимаю, что здесь происходит, любая помощь будет принята с благодарностью.

5
Что производит `type openscad`? Chris Eberle 12 лет назад 4
что выводит `echo $ PATH` 12 лет назад 1

2 ответа на вопрос

6
geekosaur

whichвранье; он может сообщать о вещах, основанных на идеализированной ситуации, полученной из файлов запуска вашей оболочки, при этом упуская некоторые возможности и не отслеживая никаких изменений, не внесенных стандартными файлами. Используйте, typeчтобы увидеть, что на самом деле думает оболочка.

2@mress:1 B$ type which which is /usr/bin/which 

Внешние команды просто не могут сказать, что на самом деле произойдет, потому что они должны угадывать функции и псевдонимы на основе ваших файлов запуска и не будут знать о вещах, созданных autoloadмеханизмами; вам нужно спросить саму оболочку, что она будет делать.

2@mress:2 B$ type type type is a shell builtin 
Все, что вы написали, правильно, но не ответило, почему его bash возвращается для простого "openscad", "/ usr / local / bin / openscad: такого файла или каталога нет". 12 лет назад 0
@kobame: ни я, ни кто-либо другой не могут знать ответ, не зная вывода `type openscad`. Что я и пытался объяснить; по-видимому, я потерпел неудачу. geekosaur 12 лет назад 0
[dataproc @ Euclid ~] $ type openscad openscad хэшируется (/ usr / local / bin / openscad) 12 лет назад 0
Я не уверен, что означает "openscad is hashed", но для команды не было псевдонима. Спасибо всем за быстрый ответ. 12 лет назад 0
@shawn: запустите `hash -r`, а затем снова введите` openscad`. Похоже, он был в `/ usr / local / bin`, перемещен, и оболочка не обновила хэш своего внутреннего местоположения. geekosaur 12 лет назад 0
@shawn: большинство оболочек хранят хеш-таблицу, отображающую хэшированную версию простой команды на полное имя пути, потому что полный поиск `$ PATH` обходится довольно дорого, когда вы используете оболочку, и выполнение этих команд - ваша основная функция. Команда `hash` может использоваться для манипулирования этой таблицей. geekosaur 12 лет назад 0
Спасибо geekosaur, который работал, я буду читать эту хэш-команду немного больше и, надеюсь, смогу узнать, что происходит в следующий раз. 12 лет назад 0
@geekosaur Хорошее объяснение! Thanx. Один вопрос: когда (и как) Bash обновляет свою хеш-таблицу? Итак, когда я устанавливаю новую версию o любой команды в другой каталог в PATH и после удаления - когда обновляется хэш-таблица? 12 лет назад 0
@kobame: я не знаю конкретных правил для `bash`. Некоторые оболочки периодически проверяют время модификации каталогов в `$ PATH`; некоторые, кажется, никогда не обновляются. Я просто выработал привычку всегда выполнять `hash -r` после внесения любых изменений в каталог в` $ PATH` (установка, удаление или перемещение программ и т. Д.). geekosaur 12 лет назад 0
Я думаю, что его нужно запускать только тогда, когда в вашем пути есть что-то, что вы вручную удаляете и заменяете чем-то в другом каталоге, также в пути. Я использую bash довольно долгое время, и я впервые столкнулся с такой проблемой. 12 лет назад 0
0
jm666

Не зная вашего .profile (.bashrc и т. Д.), Только догадываясь, чем вы где-то обладаете

alias openscad=/usr/local/bin/openscad 

и именно поэтому ваш bash пытается запустить / usr / local / bin / openscad, а не по умолчанию в / usr / bin.