Как мне исправить "ПУТЬ: неопределенная переменная". в csh?

Я устанавливаю некоторое программное обеспечение с открытым исходным кодом, компилируя его исходный код - в Ubuntu 16.04 - следуя инструкциям в файле readme. В определенный момент (пункт 3b в ссылке) руководство требует, чтобы я запустил файл.csh, расположенный в определенном каталоге, для генерации исполняемых файлов. Когда я выполняю требуемый сценарий csh из терминала в нужном каталоге, набрав ./compile_all.cshили беги csh чтобы запустить интерактивную оболочку, меня встречает следующая строка на терминале:

MANPATH: undefined variable. 

Кто-нибудь может подсказать мне, как я могу исправить эту ошибку?

Следующее является результатом manpath команда при запуске из терминала Ubuntu:

~$ manpath
/home/atrcheema/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man

~./cshrc файл содержал только одну строку, как видно при выполнении следующей команды:

:/home$ vim ~/.cshrc
setenv MANPATH ${MANPATH}:${HOME}/share/man

Первые несколько строк compile_all.csh являются следующими:

#!/bin/csh

####### section added by York Prado 10/2009
if( ! (-e /usr/bin/f77 || -e /bin/f77 || -e /usr/local/bin/f77) ) then 
echo "f77 command is not found"
echo "Please make sure you have the fortran 77 compiler installed"
exit 1
endif 

# section below moved to compile_hspf_libs.csh
#cd hspf/lib3.2/src/util
#make clean 
#make 
#make install 
#cd ../ 
#cd wdm/
#make clean
#make 
#make install
#cd ../
#cd adwdm/
#make clean
##make
#make install
#echo "Compiled all the lib3.2 files needed to compile the CBWM"
#cd ../../../../ 

######### end York Prado section

cd lib/dsn/
f77 -c dsn_utils.f

cd ../util
rm ../util_lib.a
./compile
cd ../get
rm ../get_lib.a
./compile
cd ../tty/
gcc -c -o ../ttyux.o ttyux.c

2 ответа

Решение

Сообщение об ошибке

MANPATH: undefined variable. 

потому что Ubuntu не устанавливает MANPATH по умолчанию (man имеет встроенный путь поиска) и csh (в отличие от оболочек Борна) не рассматривает неустановленные переменные как пустые.

Однако сам по себе он не должен препятствовать запуску оболочки ИЛИ любого скрипта C-shell.

Тем не менее, если вы хотите "исправить" это, вам нужно будет изменить ваш ~/.cshrc файл для проверки MANPATH установлен или нет и относиться к двум случаям соответственно - что-то вроде

if ( ${?MANPATH} ) then 
  setenv MANPATH ${MANPATH}:${HOME}/share/man
else 
  setenv MANPATH ${HOME}/share/man
endif

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Я не бегло в csh Синтаксис так YMMV.

+ Изменить ${MANPATH}:${HOME}/share/man в "`manpath`:$HOME/share/man",

Ваш ~/.cshrc файл содержит (и фактически состоит полностью из) команду, цель которой состоит в том, чтобы расширить список каталогов, в которых man Команда будет искать справочные страницы:

setenv MANPATH ${MANPATH}:${HOME}/share/man

Однако это не совсем правильный способ достижения этого, и он не работает для вашей ситуации, потому что MANPATH Переменная окружения не существует. Вот что выдает ваше сообщение об ошибке. 1

manpath Команда, которую вы обнаружили , работает, автоматически делает правильные вещи. Он проверяет, есть ли MANPATH переменная окружения и использует ее, если она существует (и непуста). Но если такой переменной среды нет (или она существует, но она пуста), manpath консультируется с файлом конфигурации /etc/manpath.config определить, какой должен быть manpath по умолчанию, и использовать его. Когда вы устанавливаете MANPATH переменная окружения, записи в этом файле больше не используются автоматически, поэтому вы несете ответственность за MANPATH содержит их, за исключением необычного случая, что вы не хотите их. 2

К счастью, это легко сделать, потому что вы можете просто использовать подстановку команд, чтобы включить выход из manpath команда в значении, присвоенном MANPATH переменная. Заменить линию ~/.cshrc В настоящее время содержит с этим:

setenv MANPATH "`manpath`:$HOME/share/man"

Backticks (``) выполнить подстановку команд в csh а также tcsh, В ракушках в стиле Борна bash есть также $() синтаксис для подстановки команд, который обычно предпочтительнее обратных кавычек, но это не относится к оболочкам языка Си. Вы не можете использовать $() синтаксис с csh / tcsh; они не поддерживают это.


1 Однако, как говорит Steeldriver, вы, вероятно, можете продолжить работу, не решая эту проблему. Большинство сценариев не используют man команда, хотя некоторые могут. Даже если ваш скрипт устанавливает программное обеспечение, содержащее страницы справочника, он, скорее всего, не будет обращаться к текущему manpath, чтобы выяснить, где их разместить. Конечно, если его документация говорит, что это так, то это заменяет это предположение. Я предлагаю вам решить эту проблему, но вы, вероятно, можете продолжить, не делая этого.

2 The man Команда использует ту же процедуру, чтобы решить, где искать справочные страницы, возможно, вызвав manpath , Смотрите manpath (5) ( man 5 manpath ), который говорит: "Если переменная окружения $ MANPATH уже установлена, информация, содержащаяся в /etc/manpath.config, не будет переопределять ее". Путем тестирования я подтвердил, что это так. Например, бег env MANPATH=. man tcsh из вашего домашнего каталога скажут No manual entry for tcsh ,

Другие вопросы по тегам