¿Cuáles son las razones por las cuales los comandos me gustan whereiso whichno 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 finden 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
}

typestackoverflow.com/questions/592620/…nvm. No lo necesito Quiero saber dónde está ubicadoRespuestas:
La
whichutilidad 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,
whereisbusca 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,
findes 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
locatecomando, 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 nvmfuente
whichse comportará correctamente de esta manera si está utilizando una variante de C-shell, comocshotcsh. También puede funcionar correctamente en otros depósitos. Sin embargo, enbashesto no funciona.bashusa eltypecomando en su lugar. Es perfectamente posiblewhichno darle nadabashincluso cuando uno puede escribirnvmy 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 esowhereisywhichno 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
whichno 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á, perowhichpuede que no.Por ejemplo,
whichno 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
typelugar de hacerlowhich, ya que no parece tener este problema. Vea esta respuesta para más alternativas.fuente
cshotcshde fondo. Me pica estabashpeculiaridad casi cada vez que la usowhich.Si su
nvmcomando es en realidad un alias o una función de shell,whichlo identificará solo si usa una opción apropiada (por ejemplo,--read-aliaso--read-functions; verwhich(1)), ywhereisserá completamente inútil.fuente
whereisywhichsolo busca ubicaciones específicas.man whereis:man which:La ruta se refiere a la
PATHvariable 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/binEtc.) y puedan iniciarse simplemente escribiendo el nombre del comando.Si instaló
npmen 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
nvmen la RUTA ya que puedo acceder a este comando desde cualquier directoriowhichpuede fallar en encontrar cosas en el camino en algunos casos cuando se usabash. Ver la respuesta de @ Pathogen arriba.