¿Cuáles son las razones por las cuales los comandos me gustan whereis
o which
no me muestran la ubicación del comando? Por ejemplo, tengo nvm y quiero saber dónde está ubicado, pero ninguno de estos comandos me ayuda a encontrar el binario. ¿Debo usar solo find
en este caso?
ACTUALIZAR
Aquí hay una salida larga de 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
. No lo necesito Quiero saber dónde está ubicadoRespuestas:
La
which
utilidad solo busca archivos en su ruta existente, por lo que si no puede escribir "nvm" y hacer que ejecute nvm, entonces no lo ubicará.Por otro lado,
whereis
busca una lista codificada de rutas para el programa, su página de manual y su directorio de origen. Es posible que whereis encuentre algo si nvm no está en su ruta, pero si nvm no está en la lista codificada de rutas donde busca, igualmente no tendrá éxito.Como implica,
find
es una utilidad mucho más flexible para buscar cualquier ruta que desee para cualquier tipo de archivo que pueda especificar. Si hay un ejecutable nvm en cualquier parte de su sistema, find se puede usar para buscarlo, independientemente de que esté en la ruta de su sistema.Una cuarta opción a considerar sería el
locate
comando, que utiliza una base de datos indexada de archivos en su sistema para encontrar rápidamente un archivo en cualquier parte de su sistema, con una invocación similar a la cual o dónde está, por ejemplolocate nvm
fuente
which
se comportará correctamente de esta manera si está utilizando una variante de C-shell, comocsh
otcsh
. También puede funcionar correctamente en otros depósitos. Sin embargo, enbash
esto no funciona.bash
usa eltype
comando en su lugar. Es perfectamente posiblewhich
no darle nadabash
incluso cuando uno puede escribirnvm
y hacer que funcione.Si ha utilizado curl para instalar nvm (y posiblemente otros métodos), se instalará como un conjunto de funciones de shell en su directorio de inicio, en una carpeta oculta llamada
.nvm/nvm.sh
. Como no es un comando (explicado en las otras respuestas), es por esowhereis
ywhich
no lo encuentro. Tenga en cuenta que el mismo directorio tiene un archivo Readme.markdown que contiene bastante información detallada sobre nvm.Este es el script que puede curvar para instalar nvm: https://raw.githubusercontent.com/creationix/nvm/v0.17.3/install.sh
Tuve el mismo problema y hurgar en eso reveló dónde se estaba instalando, por lo que podría ser un método útil para descubrir dónde viven otros comandos cuando en realidad no son comandos.
Esta es una gran explicación del autor de nvm sobre cómo funciona nvm.sh:
https://github.com/creationix/nvm/issues/521
En resumen, nvm es una colección de funciones de shell, y aunque tiene la extensión .sh, en realidad no es un script de shell. Es por eso que no tiene permisos ejecutables (y no debe cambiarse). Para ejecutarlo, en su lugar debe ser 'fuente':
El punto es sinónimo del comando 'fuente'. El aprovisionamiento hace que las funciones dentro del archivo estén disponibles para el shell actual. Si, por ejemplo, necesita ejecutar nvm desde un script de shell, que abre un nuevo shell durante la duración del script, deberá obtener nvm en el archivo porque de lo contrario no estará disponible.
fuente
No está directamente relacionado con la pregunta, pero a veces
which
no puede encontrar un archivo a pesar de que el archivo está en su ruta, y puede ejecutar con éxito el comando en su shell. Esto puede suceder si ha utilizado expansiones de shell en su ruta: su shell las usará, perowhich
puede que no.Por ejemplo,
which
no podrá encontrar ejecutables en este directorio (donde su shell expande ~ a su directorio de inicio):export PATH="$PATH:~/foo/bin"
Si está usando bash, también podría acostumbrarse a usarlo en
type
lugar de hacerlowhich
, ya que no parece tener este problema. Vea esta respuesta para más alternativas.fuente
csh
otcsh
de fondo. Me pica estabash
peculiaridad casi cada vez que la usowhich
.Si su
nvm
comando es en realidad un alias o una función de shell,which
lo identificará solo si usa una opción apropiada (por ejemplo,--read-alias
o--read-functions
; verwhich(1)
), ywhereis
será completamente inútil.fuente
whereis
ywhich
solo busca ubicaciones específicas.man whereis
:man which
:La ruta se refiere a la
PATH
variable de entorno. ( Lea más al respecto )Por lo tanto, estas utilidades solo encontrarán programas que se encuentren en una de las ubicaciones predeterminadas (p
/bin
. Ej. ,/usr/local/bin
Etc.) y puedan iniciarse simplemente escribiendo el nombre del comando.Si instaló
npm
en otro lugar, por ejemplo/home/username/bin/npm
, y ese directorio no está en suPATH
, no se encontrará de esta manera. Tendrá que usar, por ejemplofind
.fuente
nvm
en la RUTA ya que puedo acceder a este comando desde cualquier directoriowhich
puede fallar en encontrar cosas en el camino en algunos casos cuando se usabash
. Ver la respuesta de @ Pathogen arriba.