Каковы причины , почему команды , как whereis
и which
не показывают мне расположение команды? Например, у меня есть nvm и я хочу знать, где он находится, но ни одна из этих команд не помогает мне найти двоичный файл. Я должен использовать только find
в этом случае?
ОБНОВИТЬ
Вот длинный вывод type nvm
$ type nvm
nvm is a function
nvm ()
{
if [ $# -lt 1 ]; then
nvm help;
return;
fi;
local uname="$(uname -a)";
local os=;
local arch="$(uname -m)";
case "$uname" in
Linux\ *)
os=linux
;;
Darwin\ *)
os=darwin
;;
SunOS\ *)
os=sunos
;;
FreeBSD\ *)
os=freebsd
;;
esac;
case "$uname" in
*x86_64*)
arch=x64
;;
*i*86*)
arch=x86
;;
*armv6l*)
arch=arm-pi
;;
esac;
local VERSION;
local ADDITIONAL_PARAMETERS;
case $1 in
"help")
echo;
echo "Node Version Manager";
echo;
echo "Usage:";
echo " nvm help Show this message";
echo " nvm install [-s] <version> Download and install a <version>, [-s] from source";
echo " nvm uninstall <version> Uninstall a version";
echo " nvm use <version> Modify PATH to use <version>";
echo " nvm run <version> [<args>] Run <version> with <args> as arguments";
echo " nvm current Display currently activated version";
echo " nvm ls List installed versions";
echo " nvm ls <version> List versions matching a given description";
echo " nvm ls-remote List remote versions available for install";
echo " nvm deactivate Undo effects of NVM on current shell";
echo " nvm alias [<pattern>] Show all aliases beginning with <pattern>";
echo " nvm alias <name> <version> Set an alias named <name> pointing to <version>";
echo " nvm unalias <name> Deletes the alias named <name>";
echo " nvm copy-packages <version> Install global NPM packages contained in <version> to current version";
echo;
echo "Example:";
echo " nvm install v0.10.24 Install a specific version number";
echo " nvm use 0.10 Use the latest available 0.10.x release";
echo " nvm run 0.10.24 myApp.js Run myApp.js using node v0.10.24";
echo " nvm alias default 0.10.24 Set default node version on a shell";
echo;
echo "Note:";
echo " to remove, delete or uninstall nvm - just remove ~/.nvm, ~/.npm and ~/.bower folders";
echo
;;
"install")
local binavail;
local t;
local url;
local sum;
local tarball;
local shasum='shasum';
local nobinary;
if ! has "curl"; then
echo 'NVM Needs curl to proceed.' 1>&2;
fi;
if ! has "shasum"; then
shasum='sha1sum';
fi;
if [ $# -lt 2 ]; then
nvm help;
return;
fi;
shift;
nobinary=0;
if [ "$1" = "-s" ]; then
nobinary=1;
shift;
fi;
if [ "$os" = "freebsd" ]; then
nobinary=1;
fi;
VERSION=`nvm_remote_version $1`;
ADDITIONAL_PARAMETERS='';
shift;
while [ $# -ne 0 ]; do
ADDITIONAL_PARAMETERS="$ADDITIONAL_PARAMETERS $1";
shift;
done;
[ -d "$NVM_DIR/$VERSION" ] && echo "$VERSION is already installed." && return;
if [ $nobinary -ne 1 ]; then
if [ -n "$os" ]; then
binavail=;
case "$VERSION" in
v0.8.[012345])
binavail=0
;;
v0.[1234567].*)
binavail=0
;;
*)
binavail=1
;;
esac;
if [ $binavail -eq 1 ]; then
t="$VERSION-$os-$arch";
url="http://nodejs.org/dist/$VERSION/node-${t}.tar.gz";
sum=`curl -s http://nodejs.org/dist/$VERSION/SHASUMS.txt | \grep node-${t}.tar.gz | awk '{print $1}'`;
local tmpdir="$NVM_DIR/bin/node-${t}";
local tmptarball="$tmpdir/node-${t}.tar.gz";
if ( mkdir -p "$tmpdir" && curl -L -C - --progress-bar $url -o "$tmptarball" && nvm_checksum `${shasum} "$tmptarball" | awk '{print $1}'` $sum && tar -xzf "$tmptarball" -C "$tmpdir" --strip-components 1 && rm -f "$tmptarball" && mv "$tmpdir" "$NVM_DIR/$VERSION" ); then
nvm use $VERSION;
return;
else
echo "Binary download failed, trying source." 1>&2;
rm -rf "$tmptarball" "$tmpdir";
fi;
fi;
fi;
fi;
echo "Additional options while compiling: $ADDITIONAL_PARAMETERS";
tarball='';
sum='';
make='make';
if [ "$os" = "freebsd" ]; then
make='gmake';
fi;
local tmpdir="$NVM_DIR/src";
local tmptarball="$tmpdir/node-$VERSION.tar.gz";
if [ "`curl -Is "http://nodejs.org/dist/$VERSION/node-$VERSION.tar.gz" | \grep '200 OK'`" != '' ]; then
tarball="http://nodejs.org/dist/$VERSION/node-$VERSION.tar.gz";
sum=`curl -s http://nodejs.org/dist/$VERSION/SHASUMS.txt | \grep node-$VERSION.tar.gz | awk '{print $1}'`;
else
if [ "`curl -Is "http://nodejs.org/dist/node-$VERSION.tar.gz" | \grep '200 OK'`" != '' ]; then
tarball="http://nodejs.org/dist/node-$VERSION.tar.gz";
fi;
fi;
if ( [ ! -z $tarball ] && mkdir -p "$tmpdir" && curl -L --progress-bar $tarball -o "$tmptarball" && if [ "$sum" = "" ]; then
:;
else
nvm_checksum `${shasum} "$tmptarball" | awk '{print $1}'` $sum;
fi && tar -xzf "$tmptarball" -C "$tmpdir" && cd "$tmpdir/node-$VERSION" && ./configure --prefix="$NVM_DIR/$VERSION" $ADDITIONAL_PARAMETERS && $make && rm -f "$NVM_DIR/$VERSION" 2> /dev/null && $make install ); then
nvm use $VERSION;
if ! has "npm"; then
echo "Installing npm...";
if [[ "`expr match $VERSION '\(^v0\.1\.\)'`" != '' ]]; then
echo "npm requires node v0.2.3 or higher";
else
if [[ "`expr match $VERSION '\(^v0\.2\.\)'`" != '' ]]; then
if [[ "`expr match $VERSION '\(^v0\.2\.[0-2]$\)'`" != '' ]]; then
echo "npm requires node v0.2.3 or higher";
else
curl https://npmjs.org/install.sh | clean=yes npm_install=0.2.19 sh;
fi;
else
curl https://npmjs.org/install.sh | clean=yes sh;
fi;
fi;
fi;
else
echo "nvm: install $VERSION failed!";
return 1;
fi
;;
"uninstall")
[ $# -ne 2 ] && nvm help && return;
if [[ $2 == `nvm_version` ]]; then
echo "nvm: Cannot uninstall currently-active node version, $2.";
return 1;
fi;
VERSION=`nvm_version $2`;
if [ ! -d $NVM_DIR/$VERSION ]; then
echo "$VERSION version is not installed...";
return;
fi;
t="$VERSION-$os-$arch";
rm -rf "$NVM_DIR/src/node-$VERSION" "$NVM_DIR/src/node-$VERSION.tar.gz" "$NVM_DIR/bin/node-${t}" "$NVM_DIR/bin/node-${t}.tar.gz" "$NVM_DIR/$VERSION" 2> /dev/null;
echo "Uninstalled node $VERSION";
for A in `\grep -l $VERSION $NVM_DIR/alias/* 2>/dev/null`;
do
nvm unalias `basename $A`;
done
;;
"deactivate")
if [[ $PATH == *$NVM_DIR/*/bin* ]]; then
export PATH=${PATH%$NVM_DIR/*/bin*}${PATH#*$NVM_DIR/*/bin:};
hash -r;
echo "$NVM_DIR/*/bin removed from \$PATH";
else
echo "Could not find $NVM_DIR/*/bin in \$PATH";
fi;
if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
export MANPATH=${MANPATH%$NVM_DIR/*/share/man*}${MANPATH#*$NVM_DIR/*/share/man:};
echo "$NVM_DIR/*/share/man removed from \$MANPATH";
else
echo "Could not find $NVM_DIR/*/share/man in \$MANPATH";
fi;
if [[ $NODE_PATH == *$NVM_DIR/*/lib/node_modules* ]]; then
export NODE_PATH=${NODE_PATH%$NVM_DIR/*/lib/node_modules*}${NODE_PATH#*$NVM_DIR/*/lib/node_modules:};
echo "$NVM_DIR/*/lib/node_modules removed from \$NODE_PATH";
else
echo "Could not find $NVM_DIR/*/lib/node_modules in \$NODE_PATH";
fi
;;
"use")
if [ $# -eq 0 ]; then
nvm help;
return;
fi;
if [ $# -eq 1 ]; then
rc_nvm_version;
if [ ! -z $RC_VERSION ]; then
VERSION=`nvm_version $RC_VERSION`;
fi;
else
VERSION=`nvm_version $2`;
fi;
if [ -z $VERSION ]; then
nvm help;
return;
fi;
if [ -z $VERSION ]; then
VERSION=`nvm_version $2`;
fi;
if [ ! -d "$NVM_DIR/$VERSION" ]; then
echo "$VERSION version is not installed yet";
return 1;
fi;
if [[ $PATH == *$NVM_DIR/*/bin* ]]; then
PATH=${PATH%$NVM_DIR/*/bin*}$NVM_DIR/$VERSION/bin${PATH#*$NVM_DIR/*/bin};
else
PATH="$NVM_DIR/$VERSION/bin:$PATH";
fi;
if [ -z "$MANPATH" ]; then
MANPATH=$(manpath);
fi;
MANPATH=${MANPATH#*$NVM_DIR/*/man:};
if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
MANPATH=${MANPATH%$NVM_DIR/*/share/man*}$NVM_DIR/$VERSION/share/man${MANPATH#*$NVM_DIR/*/share/man};
else
MANPATH="$NVM_DIR/$VERSION/share/man:$MANPATH";
fi;
if [[ $NODE_PATH == *$NVM_DIR/*/lib/node_modules* ]]; then
NODE_PATH=${NODE_PATH%$NVM_DIR/*/lib/node_modules*}$NVM_DIR/$VERSION/lib/node_modules${NODE_PATH#*$NVM_DIR/*/lib/node_modules};
else
NODE_PATH="$NVM_DIR/$VERSION/lib/node_modules:$NODE_PATH";
fi;
export PATH;
hash -r;
export MANPATH;
export NODE_PATH;
export NVM_PATH="$NVM_DIR/$VERSION/lib/node";
export NVM_BIN="$NVM_DIR/$VERSION/bin";
echo "Now using node $VERSION"
;;
"run")
if [ $# -lt 2 ]; then
nvm help;
return;
fi;
VERSION=`nvm_version $2`;
if [ ! -d $NVM_DIR/$VERSION ]; then
echo "$VERSION version is not installed yet";
return;
fi;
if [[ $NODE_PATH == *$NVM_DIR/*/lib/node_modules* ]]; then
RUN_NODE_PATH=${NODE_PATH%$NVM_DIR/*/lib/node_modules*}$NVM_DIR/$VERSION/lib/node_modules${NODE_PATH#*$NVM_DIR/*/lib/node_modules};
else
RUN_NODE_PATH="$NVM_DIR/$VERSION/lib/node_modules:$NODE_PATH";
fi;
echo "Running node $VERSION";
NODE_PATH=$RUN_NODE_PATH $NVM_DIR/$VERSION/bin/node "${@:3}"
;;
"ls" | "list")
print_versions "`nvm_ls $2`";
if [ $# -eq 1 ]; then
echo -ne "current: \t";
nvm_version current;
nvm alias;
fi;
return
;;
"ls-remote" | "list-remote")
print_versions "`nvm_ls_remote $2`";
return
;;
"current")
echo -ne "current: \t";
nvm_version current
;;
"alias")
mkdir -p $NVM_DIR/alias;
if [ $# -le 2 ]; then
for ALIAS in $(nvm_set_nullglob; echo $NVM_DIR/alias/$2* );
do
DEST=`cat $ALIAS`;
VERSION=`nvm_version $DEST`;
if [ "$DEST" = "$VERSION" ]; then
echo "$(basename $ALIAS) -> $DEST";
else
echo "$(basename $ALIAS) -> $DEST (-> $VERSION)";
fi;
done;
return;
fi;
if [ ! "$3" ]; then
rm -f $NVM_DIR/alias/$2;
echo "$2 -> *poof*";
return;
fi;
mkdir -p $NVM_DIR/alias;
VERSION=`nvm_version $3`;
if [ $? -ne 0 ]; then
echo "! WARNING: Version '$3' does not exist." 1>&2;
fi;
echo $3 > "$NVM_DIR/alias/$2";
if [ ! "$3" = "$VERSION" ]; then
echo "$2 -> $3 (-> $VERSION)";
else
echo "$2 -> $3";
fi
;;
"unalias")
mkdir -p $NVM_DIR/alias;
[ $# -ne 2 ] && nvm help && return;
[ ! -f $NVM_DIR/alias/$2 ] && echo "Alias $2 doesn't exist!" && return;
rm -f $NVM_DIR/alias/$2;
echo "Deleted alias $2"
;;
"copy-packages")
if [ $# -ne 2 ]; then
nvm help;
return;
fi;
local VERSION=`nvm_version $2`;
local ROOT=`(nvm use $VERSION && npm -g root) | tail -n1`;
local ROOTDEPTH=$((`echo $ROOT | sed 's/[^\/]//g'|wc -m` -1));
local INSTALLS;
INSTALLS=(`nvm use $VERSION > /dev/null && npm -g -p ll | \grep "$ROOT\/[^/]\+$" | cut -d '/' -f $(($ROOTDEPTH + 2)) | cut -d ":" -f 2 | \grep -v npm | tr "\n" " "`);
npm install -g ${INSTALLS[@]}
;;
"clear-cache")
rm -f $NVM_DIR/v* 2> /dev/null;
echo "Cache cleared."
;;
"version")
print_versions "`nvm_version $2`"
;;
*)
nvm help
;;
esac
}
type
stackoverflow.com/questions/592620/…nvm
. Мне это не нужно Я хочу знать, где он находитсяОтветы:
which
Утилита только ищет существующий путь для файлов, так что если вы не можете набрать «NVM» и запустить его NVM, то что не будет его найти.С другой стороны,
whereis
выполняет поиск в жестко запрограммированном списке путей для программы, ее страницы руководства и ее исходного каталога. Возможно, что whereis найдет что-то, если nvm не находится на вашем пути, но если nvm отсутствует в жестко закодированном списке путей, по которым осуществляется поиск, это также будет неудачным.Как вы понимаете,
find
это гораздо более гибкая утилита для поиска по любому пути, который вы хотите, для любого типа файла, который вы можете указать. Если где-нибудь в вашей системе есть исполняемый файл nvm, find может использоваться для его поиска, независимо от того, находится ли он в системном пути.Четвертый вариант -
locate
команда, которая использует индексированную базу данных файлов в вашей системе, чтобы быстро найти файл в любом месте вашей системы, с аналогичным простым вызовом куда или где, напримерlocate nvm
источник
which
будет правильно вести себя так, если вы используете вариант C-shell, напримерcsh
илиtcsh
. Это может работать правильно и в других оболочках. Однако вbash
нем не работает. вместо этогоbash
используетtype
команду Вполне возможно,which
что вы ничего не дадите,bash
даже если можно набрать текстnvm
и заставить его работать.Если вы использовали curl для установки nvm (и, возможно, других методов), он будет установлен как набор функций оболочки в вашем домашнем каталоге, в скрытой папке с именем
.nvm/nvm.sh
. Поскольку это не команда (объясняется в других ответах), именно поэтомуwhereis
иwhich
не удается ее найти. Обратите внимание, что в том же каталоге есть файл Readme.markdown, который содержит довольно подробную информацию о nvm.Это скрипт, который вы можете свернуть для установки nvm: https://raw.githubusercontent.com/creationix/nvm/v0.17.3/install.sh
У меня была та же самая проблема, и я обнаружил, где она сама себя устанавливает, так что это может быть полезным способом узнать, где живут другие команды, когда они на самом деле не являются командами.
Это отличное объяснение автора nvm о том, как работает nvm.sh:
https://github.com/creationix/nvm/issues/521
Короче говоря, nvm - это набор функций оболочки, и хотя он имеет расширение .sh, на самом деле он не является сценарием оболочки. Вот почему он не имеет исполняемых разрешений (и не должен быть изменен). Чтобы запустить его, вместо этого он должен быть 'sourced':
Точка является синонимом команды «источник». Sourcing делает функции в файле доступными для текущей оболочки. Если, например, вам нужно запустить nvm из сценария оболочки, который открывает новую оболочку на время действия сценария, вам нужно будет ввести nvm в файл, поскольку в противном случае он будет недоступен.
источник
Не имеет прямого отношения к вопросу, но иногда
which
не может найти файл, даже если файл находится на вашем пути, и вы можете успешно выполнить команду в своей оболочке. Это может произойти, если вы использовали расширения оболочки на своем пути: ваша оболочка будет использовать их, ноwhich
не сможет.Например,
which
не найдет исполняемые файлы в этом каталоге (где ~ расширяется вашей оболочкой до вашего домашнего каталога):export PATH="$PATH:~/foo/bin"
Если вы используете bash, вы можете использовать
type
вместо привычкиwhich
, так как у вас, похоже, нет этой проблемы. Смотрите этот ответ для получения дополнительной альтернативы.источник
csh
илиtcsh
фона. Я укушен этойbash
особенностью почти каждый раз, когда используюwhich
.Если ваша
nvm
команда на самом деле является псевдонимом или функцией оболочки, онаwhich
будет идентифицирована только в том случае, если вы используете соответствующую опцию (например,--read-alias
или--read-functions
; seewhich(1)
), иwhereis
будет совершенно бесполезной.источник
whereis
иwhich
только искать конкретные места.man whereis
:man which
:Путь относится к
PATH
переменной среды. ( Подробнее об этом читайте )Таким образом, эти утилиты найдут только те программы, которые находятся в одном из местоположений по умолчанию (например
/bin
,/usr/local/bin
и т. Д.), И их можно запустить, просто введя имя команды.Если вы установили
npm
где-то еще, например/home/username/bin/npm
, и этот каталог не находится в вашемPATH
, он не будет найден таким образом. Вам нужно будет использовать, напримерfind
.источник
nvm
в PATH я могу получить доступ к этой команде из любого каталогаwhich
может не найти вещи в пути в некоторых случаях при использованииbash
. Смотрите ответ @ Pathogen выше.