Tại sao 'whereis' và 'which' không hiển thị cho tôi vị trí chỉ huy?


13

Các lý do tại sao các lệnh như whereishoặc whichkhông hiển thị cho tôi vị trí của lệnh là gì? Ví dụ: tôi có nvm và muốn biết nó nằm ở đâu, nhưng không có lệnh nào trong số này giúp tôi tìm nhị phân. Tôi chỉ nên sử dụng findtrong trường hợp này?

CẬP NHẬT

Đây là đầu ra dài của 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 nó loại nguồn của nvm. Tôi không cần nó. Tôi muốn biết nó nằm ở đâu
Vitalii Korsakov

Gì? loại làm khá nhiều điều tương tự có, ngoại trừ truy cập nhiều địa điểm (bí danh, chức năng, vv ...), nhanh hơn, khả năng di chuyển, vv ...

@BroSlow xem cập nhật vui lòng
Vitalii Korsakov

Nếu lệnh là bí danh thì bạn có thể sử dụng 'gõ' <lệnh của bạn> để kiểm tra bí danh.
Sagar Jagnade

Câu trả lời:


5

Các whichtiện ích chỉ tìm kiếm con đường hiện tại của bạn cho các tập tin, vì vậy nếu bạn không thể gõ "nvm" và có nó chạy nvm, sau đó sẽ không xác định vị trí nó.

Mặt khác, whereistìm kiếm một danh sách các đường dẫn được mã hóa cứng cho chương trình, trang thủ công và thư mục nguồn của nó. Có thể là nơi mà bạn sẽ tìm thấy thứ gì đó nếu nvm không nằm trong đường dẫn của bạn, nhưng nếu nvm không nằm trong danh sách được mã hóa cứng của các đường dẫn trong đó tìm kiếm, nó sẽ không thành công.

Như bạn ngụ ý, findlà một tiện ích linh hoạt hơn nhiều để tìm kiếm bất kỳ đường dẫn nào bạn muốn cho bất kỳ loại tệp nào bạn có thể chỉ định. Nếu có một nvm thực thi ở bất cứ đâu trên hệ thống của bạn, find có thể được sử dụng để săn lùng nó, bất kể nó nằm trong đường dẫn hệ thống của bạn.

Tùy chọn thứ tư để xem xét sẽ là locatelệnh sử dụng cơ sở dữ liệu được lập chỉ mục các tệp trên hệ thống của bạn để nhanh chóng tìm thấy tệp ở bất kỳ đâu trên hệ thống của bạn, với một lời gọi đơn giản tương tự đến đó hoặc ví dụlocate nvm


whichsẽ hành xử đúng theo cách này nếu bạn đang sử dụng biến thể vỏ chữ C, chẳng hạn như cshhoặc tcsh. Nó có thể hoạt động chính xác trong các vỏ khác. Tuy nhiên, trong bashnó không hoạt động. bashsử dụng typelệnh thay thế. Hoàn toàn có thể cho whichbạn bất cứ thứ gì bashngay cả khi người ta có thểnvmvà làm cho nó hoạt động.
CXJ

3

Nếu bạn đã sử dụng curl để cài đặt nvm (và có thể các phương thức khác), nó sẽ tự cài đặt dưới dạng một tập hợp các hàm shell trong thư mục chính của bạn, trong một thư mục ẩn được gọi .nvm/nvm.sh. Vì nó không phải là một lệnh (được giải thích trong các câu trả lời khác) đây là lý do tại sao whereiswhichkhông tìm thấy nó. Lưu ý rằng cùng một thư mục có Readme.markdown chứa khá nhiều thông tin chi tiết về nvm.

Đây là tập lệnh bạn có thể cuộn tròn để cài đặt nvm: https://raw.githubusercontent.com/creationix/nvm/v0.17.3/install.sh

Tôi có cùng một vấn đề và tìm hiểu xem nó đã cài đặt chính nó ở đâu, vì vậy đó có thể là một phương pháp hữu ích để tìm ra nơi các lệnh khác sống khi chúng không thực sự là lệnh.

Đây là lời giải thích tuyệt vời của tác giả của nvm về cách hoạt động của nvm.sh:

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

Nói tóm lại, nvm là một tập hợp các hàm shell và mặc dù nó có phần mở rộng .sh, nhưng thực tế không phải là một tập lệnh shell. Đây là lý do tại sao nó không có quyền thực thi (và không nên thay đổi). Để chạy nó, thay vào đó phải là 'nguồn gốc':

. ~/.nvm/nvm.sh

Dấu chấm là từ đồng nghĩa với lệnh 'nguồn'. Tìm nguồn cung cấp cho nó các chức năng trong tệp có sẵn cho shell hiện tại. Ví dụ, nếu bạn cần chạy nvm từ tập lệnh shell, mở trình bao mới trong thời lượng của tập lệnh, bạn sẽ cần nguồn nvm trong tệp vì nó sẽ không khả dụng.


3

Không liên quan trực tiếp đến câu hỏi, nhưng đôi khi whichkhông tìm thấy tệp mặc dù tệp nằm trên đường dẫn của bạn và bạn có thể thực hiện thành công lệnh trong trình bao của mình. Điều này có thể xảy ra nếu bạn đã sử dụng các mở rộng shell trên đường dẫn của mình: shell của bạn sẽ sử dụng chúng nhưng whichcó thể không.

Ví dụ: whichsẽ không tìm thấy các tệp thực thi trong thư mục này (trong đó ~ được mở rộng bởi trình bao của bạn vào thư mục chính của bạn): export PATH="$PATH:~/foo/bin"

Nếu bạn đang sử dụng bash, bạn cũng có thể có thói quen sử dụng typethay vì which, vì dường như không có vấn đề này. Xem câu trả lời này để có nhiều lựa chọn thay thế.


Điều này rất quan trọng đối với bất kỳ ai đến từ một cshhoặc tcshnền tảng. Tôi bị cắn bởi sự bashkỳ dị này hầu như mỗi khi tôi sử dụng which.
CXJ

1

Nếu nvmlệnh của bạn thực sự là bí danh hoặc hàm shell, whichsẽ chỉ xác định nó nếu bạn sử dụng một tùy chọn thích hợp (ví dụ: --read-aliashoặc --read-functions; thấy which(1)) và whereissẽ hoàn toàn vô dụng.


0

whereiswhichchỉ tìm kiếm địa điểm cụ thể.

man whereis:

Tiện ích whereis kiểm tra các thư mục nhị phân tiêu chuẩn cho các chương trình đã chỉ định, in ra các đường dẫn của bất kỳ nó tìm thấy.

man which:

Tiện ích này lấy danh sách các tên lệnh và tìm kiếm đường dẫn cho mỗi tệp thực thi sẽ được chạy nếu các lệnh này thực sự được gọi.

Đường dẫn đề cập đến PATHbiến môi trường. ( Đọc thêm về nó )

Vì vậy, những tiện ích này sẽ chỉ tìm các chương trình đó là một trong các vị trí mặc định (ví dụ /bin, /usr/local/binvv) và có thể được đưa ra bởi chỉ cần gõ tên lệnh.

Nếu bạn đã cài đặt npmở một nơi khác, ví dụ /home/username/bin/npm, và thư mục đó không có trong bạn PATH, nó sẽ không được tìm thấy theo cách này. Bạn sẽ cần phải sử dụng ví dụ find.


1
Tôi tin rằng nvmtrong PATH vì tôi có thể truy cập lệnh này từ bất kỳ thư mục nào
Vitalii Korsakov

whichcó thể không tìm thấy những thứ trong đường dẫn trong một số trường hợp khi sử dụng bash. Xem câu trả lời của @ Pathogen ở trên.
CXJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.