Это настолько эффективно, насколько это возможно.
Вы можете увидеть, какие системные вызовы выполняет оболочка, посмотрев на strace
(или эквивалент в вариантах unix, кроме Linux).
strace bash -c '[[ -d $directory_path && -r $directory_path && -x $directory_path ]]'
…
stat64("foo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
faccessat(AT_FDCWD, "foo", R_OK) = 0
faccessat(AT_FDCWD, "foo", X_OK) = 0
…
Это почти так же хорошо, как и получается.Один системный вызов для проверки типа файла ( -d
) и один системный вызов для проверки всех разрешений. Хотя bash может попытаться вывести права доступа из файлового режима, это будет работать только в системах без списков управления доступом.
Два звонка на faccessat
могут быть объединены; ни bash, ни ksh, ни dash не достаточно умны для этого. Но выигрыш будет минимальным. Inode будет в кеше, поэтому стоимость повторных системных вызовов будет чрезвычайно низкой. Если бы вам действительно была нужна такая микроэффективность, вы бы вообще не писали сценарий оболочки.
Для меня, используя virtualenv, export LD_LIBRARY_PATH=/usr/lib/atlas-base/:${LD_LIBRARY_PATH}
в конце моего .bashrc
файла исправил это.
Проблемы, с которыми я столкнулся, устранены. В одном я не уверен. Другой был результатом моего собственного невежества. Что касается странных ошибок компиляции, которые я испытывал с OpenCV 2 и более простой из двух программ, я не уверен. Однако перекомпиляция OpenCV 2, похоже, решила проблему.
Самая большая ошибка, которую я совершил, была связана с make-файлом. Я не знал, что псевдонимы, определенные в.bashrc, не транслируются в make-файлы и что make-файлы имеют совсем другой синтаксис по сравнению с bash. В bash $(opencv2)
вызывает команду, на которую ссылается opencv2, и использует ее вывод в текущей команде. Использование $opencv2
будет ссылаться на переменную и возвращать ее значение. В makefile это не так. На самом деле $(opencv2)
возвращает значение локально определенной переменной с именем opencv2. Команды могут быть определены этими переменными, но должны быть окружены обратными кавычками/метками. Ниже приведен мой исправленный make-файл:
OPENCV=`pkg-config --cflags --libs opencv2`
segmentation : main.cpp Loader.o MeanShift.o ControlParameters.h defs.h
g++ -g main.cpp Loader.o MeanShift.o $(OPENCV) -o segmentation
Loader.o : Loader.cpp Loader.h
g++ -g -c Loader.cpp $(OPENCV)
MeanShift.o : MeanShift.cpp MeanShift.h
g++ -g -c MeanShift.cpp $(OPENCV)
clean:
rm segmentation *.o