Neden 'whereis' ve 'hangisi' bana komuta yerini göstermiyor?


14

Komutların bana komutun yerini beğenmesinin whereisveya whichgöstermemesinin nedenleri nelerdir ? Ben nvm var ve nerede olduğunu bilmek istiyorum, ama bu komut hiçbiri ikili bulmak için bana yardımcı olmaz. Sadece findbu durumda mı kullanmalıyım ?

GÜNCELLEME

İşte uzun çıktı 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
}


@BroSlow kaynağı türleri nvm. Buna ihtiyacım yok. Nerede olduğunu bilmek istiyorum
Vitalii Korsakov

Ne? tip hemen hemen aynı şeyi yapar erişimler dışında yaptığı konum daha (takma adlar, fonksiyonlar, vb ...), ... vb, daha hızlı, daha taşınabilir

@BroSlow lütfen güncellemeye bakın
Vitalii Korsakov

Komut bir takma adsa, takma adı kontrol etmek için 'type' <komutunuzu> kullanabilirsiniz.
Sagar Jagnade

Yanıtlar:


5

Yardımcı whichprogram yalnızca varolan yolunuzu dosyalar için arar, bu nedenle "nvm" yazamıyorsanız ve nvm çalıştırmasını sağlayamazsanız, bu dosyayı bulamaz.

Öte yandan, whereisprogram, kılavuz sayfası ve kaynak dizini için yolların sabit kodlu bir listesini arar. Nvm yolunuzda değilse bir şey bulabilir, ancak nvm arama yapılan sabit kodlu yol listesinde değilse, aynı şekilde başarısız olur.

Dediğiniz gibi, findbelirtebileceğiniz herhangi bir dosya türü için istediğiniz herhangi bir yolu aramak için çok daha esnek bir yardımcı programdır. Sisteminizde herhangi bir yerde bir nvm çalıştırılabilir dosyası varsa, find, sistem yolunuzda olmasına bakılmaksızın onu avlamak için kullanılabilir.

İncelemek için dördüncü bir seçenek locate, sisteminizde herhangi bir yerde hızlı bir şekilde bir dosya bulmak için sisteminizde dizinlenmiş bir dosya veritabanı kullanan komuttur.locate nvm


whichcshveya gibi bir C kabuğu varyantı kullanıyorsanız doğru şekilde davranacaktır tcsh. Diğer mermilerde de düzgün çalışabilir. Ancak, içinde bashçalışmıyor. bashkullandığı typeyerine komutu. İçin Mükemmel mümkündür whichsize hiçbir şey vermek bashbir dahi olabilir yazın nvmve ona işim var.
CXJ

3

Nvm'yi (ve muhtemelen diğer yöntemleri) yüklemek için curl kullandıysanız, kendisini ana dizininizde adlandırılan gizli bir klasöre kabuk işlevleri kümesi olarak yükler .nvm/nvm.sh. Bir komut olmadığı için (diğer cevaplarda açıklanmıştır) bu yüzden whereisve whichbulamıyor. Aynı dizinde nvm hakkında biraz ayrıntılı bilgi içeren bir Benioku.markdown işareti bulunduğunu unutmayın.

Bu, nvm'yi yüklemek için kırabileceğiniz komut dosyasıdır: https://raw.githubusercontent.com/creationix/nvm/v0.17.3/install.sh

Aynı sorunu yaşadım ve kendini nereye yüklediğini ortaya koydum, bu yüzden diğer komutların gerçekte komut olmadığında nerede yaşadığını bulmak için yararlı bir yöntem olabilir.

Bu nvm yazarı nvm.sh nasıl çalışır hakkında büyük bir açıklama:

https://github.com/creationix/nvm/issues/521

Kısacası, nvm, kabuk işlevlerinin bir koleksiyonudur ve .sh uzantısına sahip olsa bile, aslında bir kabuk komut dosyası değildir. Bu nedenle yürütülebilir izinleri yoktur (ve değiştirilmemelidir). Çalıştırmak için bunun yerine 'kaynaklı' olması gerekir:

. ~/.nvm/nvm.sh

Nokta, 'source' komutu ile eşanlamlıdır. Kaynak, dosya içindeki işlevleri geçerli kabuk için kullanılabilir hale getirir. Örneğin, komut dosyası süresince yeni bir kabuk açan bir kabuk komut dosyasından nvm'yi çalıştırmanız gerekiyorsa, aksi takdirde kullanılamayacağı için dosyada nvm'yi kaynaklamanız gerekir.


3

Doğrudan soruyla ilgili değildir, ancak bazen whichdosya yolunuzda olsa bile bir dosya bulamaz ve komutu kabuğunuzda başarıyla yürütebilirsiniz. Bu, yolunuzda kabuk genişletmeleri kullandıysanız gerçekleşebilir: kabuğunuz bunları kullanır ancak whichkullanamaz.

Örneğin, whichbu dizindeki yürütülebilir dosyaları bulamaz (burada ~ kabuğunuz tarafından ana dizininize genişletilir): export PATH="$PATH:~/foo/bin"

Eğer bash kullanıyorsanız, typebunun yerine bu alışkanlığa sahip olmadığı için kullanma alışkanlığına da girebilirsiniz which. Daha fazla alternatif için bu cevaba bakınız .


Bu, bir cshveya tcsharka plandan gelen herkes için önemlidir . bashNeredeyse her kullandığımda bu tuhaflıktan ısırılıyorum which.
CXJ

1

Senin Eğer nvmkomut aslında bir takma veya bir kabuk fonksiyonudur, whichbir uygun seçeneği kullanmak durumunda bunu belirleyecektir (örneğin --read-aliasya --read-functions; bkz which(1)) ve whereistamamen yararsız olacaktır.


0

whereisve whichyalnızca belirli yerleri arayın.

man whereis:

Whereis yardımcı programı, bulduğu programların yollarını yazdırarak belirtilen programlar için standart ikili dizinleri denetler.

man which:

Hangi yardımcı program, komut adlarının bir listesini alır ve bu komutlar gerçekten çağrılmışsa çalıştırılacak her yürütülebilir dosyanın yolunu arar.

Yol , PATHortam değişkenini ifade eder . ( Daha fazla bilgi edinin )

Bu nedenle, bu yardımcı programlar yalnızca varsayılan konumlardan birinde (örn. /bin, /usr/local/binVb.) Bulunan programları bulur ve yalnızca komut adını yazarak başlatılabilir.

npmÖrneğin başka bir yere kurduysanız /home/username/bin/npmve bu dizin sizin içinizde değilse, PATHbu şekilde bulunmaz. Örneğin find.


1
nvm
PATH'de

whichkullanırken bazı durumlarda yoldaki şeyleri bulamayabilir bash. Yukarıdaki @ Pathogen'in cevabına bakınız.
CXJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.