ทำไม 'whereis' และ 'ซึ่ง' ไม่แสดงตำแหน่งของคำสั่งให้ฉันดู?


14

อะไรคือสาเหตุที่ทำให้คำสั่งเหมือนwhereisหรือwhichไม่แสดงตำแหน่งของคำสั่งให้ฉันดู? เช่นฉันมี NVM และต้องการที่จะรู้ว่ามันอยู่ที่ไหน แต่ไม่มีคำสั่งเหล่านี้ช่วยให้ฉันหาไบนารี ฉันควรใช้เฉพาะfindในกรณีนี้หรือไม่?

UPDATE

นี่คือผลลัพธ์ที่ยาวนานของ 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 nvmมันประเภทแหล่งที่มาของ ฉันไม่ต้องการมัน ฉันต้องการทราบว่ามันอยู่ที่ไหน
Vitalii Korsakov

อะไร? ประเภทจะค่อนข้างเหมือนกันซึ่งทำได้ยกเว้นการเข้าถึงที่ตั้งอื่น ๆ (นามแฝง, ฟังก์ชั่น, ฯลฯ ... ), เร็วกว่า, พกพาได้มากกว่า, ฯลฯ ...

@BroSlow โปรดดูการอัปเดต
Vitalii Korsakov

หากคำสั่งเป็นนามแฝงคุณสามารถใช้ 'type' <your command> เพื่อตรวจสอบนามแฝง
Sagar Jagnade

คำตอบ:


5

whichยูทิลิตี้ค้นหาเฉพาะเส้นทางที่มีอยู่ของคุณสำหรับไฟล์ดังนั้นหากคุณไม่สามารถพิมพ์ "NVM" และมีมันทำงาน NVM แล้วซึ่งจะไม่หามัน

ในทางกลับกันwhereisค้นหารายการพา ธ ของฮาร์ดโค้ดสำหรับโปรแกรมหน้าคู่มือและไดเรกทอรีต้นทาง อาจเป็นไปได้ว่า whereis จะค้นหาบางอย่างถ้า nvm ไม่ได้อยู่ในเส้นทางของคุณ แต่ถ้า nvm ไม่อยู่ในรายการ hardcoded ของเส้นทางที่ค้นหามันจะไม่ประสบความสำเร็จในทำนองเดียวกัน

ตามที่คุณบอกfindเป็นเครื่องมือที่มีความยืดหยุ่นมากขึ้นสำหรับการค้นหาเส้นทางที่คุณต้องการสำหรับไฟล์ประเภทใด ๆ ที่คุณสามารถระบุได้ หากมีการเรียกใช้งาน nvm ที่ใดก็ได้บนระบบของคุณ find สามารถใช้เพื่อค้นหามันได้โดยไม่ต้องคำนึงว่ามันอยู่ในพา ธ ระบบของคุณ

ตัวเลือกที่สี่ในการค้นหาคือlocateคำสั่งซึ่งใช้ฐานข้อมูลที่จัดทำดัชนีของไฟล์ในระบบของคุณเพื่อค้นหาไฟล์ได้อย่างรวดเร็วทุกที่ในระบบของคุณด้วยการร้องขออย่างง่าย ๆ เช่นหรือที่ไหนlocate nvm


whichได้อย่างถูกต้องจะทำงานด้วยวิธีนี้ถ้าคุณกำลังใช้ตัวแปร C-เปลือกเช่นหรือcsh tcshมันอาจทำงานได้อย่างถูกต้องในกระสุนอื่น ๆ เช่นกัน อย่างไรก็ตามbashมันไม่ทำงาน bashใช้typeคำสั่งแทน มันเป็นไปได้ที่ดีเลิศสำหรับwhichเพื่อให้คุณไม่มีอะไรในbashแม้ในขณะที่หนึ่งสามารถพิมพ์nvmและมีมันทำงาน
CXJ

3

หากคุณได้ขดที่ใช้ในการติดตั้ง NVM (และวิธีการอื่น ๆ อาจ) .nvm/nvm.shจะติดตั้งตัวเองเป็นชุดของฟังก์ชั่นเปลือกในไดเรกทอรีบ้านของคุณในโฟลเดอร์ที่ซ่อนอยู่เรียกว่า เนื่องจากไม่ใช่คำสั่ง (อธิบายในคำตอบอื่น ๆ ) นี่คือสาเหตุwhereisและwhichล้มเหลวในการค้นหา โปรดทราบว่าไดเรกทอรีเดียวกันมี Readme.markdown ซึ่งมีข้อมูลรายละเอียดเกี่ยวกับ nvm ค่อนข้างน้อย

นี่คือสคริปต์ที่คุณสามารถขดเพื่อติดตั้ง nvm: https://raw.githubusercontent.com/creationix/nvm/v0.17.3/install.sh

ฉันมีปัญหาเดียวกันและ poking ผ่านที่พบว่ามันติดตั้งตัวเองเพื่อที่อาจเป็นวิธีที่มีประโยชน์สำหรับการค้นหาที่คำสั่งอื่นอยู่เมื่อพวกเขาไม่ใช่คำสั่งจริง

นี่เป็นคำอธิบายที่ยอดเยี่ยมโดยผู้เขียน nvm เกี่ยวกับการทำงานของ nvm.sh:

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

กล่าวโดยย่อ nvm คือชุดของฟังก์ชันเชลล์และแม้ว่าจะมีส่วนขยาย. sh แต่จริงๆแล้วไม่ใช่สคริปต์เชลล์ นี่คือสาเหตุที่มันไม่มีสิทธิ์ดำเนินการ (และไม่ควรเปลี่ยน) หากต้องการเรียกใช้จะต้องเป็น 'แหล่งที่มา' แทน:

. ~/.nvm/nvm.sh

จุดคือคำพ้องความหมายสำหรับคำสั่ง 'source' การจัดหามันทำให้ฟังก์ชั่นภายในไฟล์พร้อมใช้งานสำหรับเชลล์ปัจจุบัน หากเช่นคุณจำเป็นต้องเรียกใช้ nvm จากเชลล์สคริปต์ซึ่งเปิดเชลล์ใหม่ในช่วงระยะเวลาของสคริปต์คุณจะต้องแหล่ง nvm ในไฟล์เพราะมันจะไม่สามารถใช้ได้


3

ไม่เกี่ยวข้องกับคำถามโดยตรง แต่บางครั้งwhichล้มเหลวในการค้นหาไฟล์แม้ว่าไฟล์นั้นจะอยู่ในเส้นทางของคุณและคุณสามารถรันคำสั่งในเชลล์ได้สำเร็จ สิ่งนี้สามารถเกิดขึ้นได้หากคุณใช้การขยายเชลล์ในเส้นทางของคุณ: เชลล์ของคุณจะใช้ แต่whichไม่สามารถใช้งานได้

ตัวอย่างเช่นwhichจะล้มเหลวในการค้นหาไฟล์ที่เรียกใช้งานได้ในไดเรกทอรีนี้ (โดยที่ ~ ถูกขยายโดยเชลล์ไปยังโฮมไดเร็กตอรี่ของคุณ): export PATH="$PATH:~/foo/bin"

หากคุณกำลังใช้ bash คุณอาจติดนิสัยในการใช้typeแทนwhichเพราะดูเหมือนว่าจะไม่มีปัญหานี้ ดูคำตอบนี้สำหรับทางเลือกเพิ่มเติม


สิ่งนี้สำคัญสำหรับทุกคนที่มาจากพื้นหลังcshหรือ tcshฉันจะได้รับกัดนี้ไม่ชอบมาพากลเกือบทุกการใช้งานผมเวลาbash which
CXJ

1

หากnvmคำสั่งของคุณเป็นนามแฝงหรือฟังก์ชั่นเชลล์คุณwhichจะระบุได้เฉพาะเมื่อคุณใช้ตัวเลือกที่เหมาะสม (เช่น--read-aliasหรือ--read-functionsดูwhich(1)) และwhereisจะไร้ประโยชน์อย่างสมบูรณ์


0

whereisและwhichค้นหาเฉพาะตำแหน่งที่ตั้งที่เฉพาะเจาะจง

man whereis:

ยูทิลิตี้ whereis จะตรวจสอบไดเรกทอรีไบนารีมาตรฐานสำหรับโปรแกรมที่ระบุโดยพิมพ์เส้นทางของที่พบ

man which:

ยูทิลิตีใดใช้รายการชื่อคำสั่งและค้นหาพา ธ สำหรับไฟล์เรียกทำงานแต่ละไฟล์ที่จะเรียกใช้หากคำสั่งเหล่านี้ถูกเรียกใช้จริง

PathหมายถึงPATHตัวแปรสภาพแวดล้อม ( อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ )

ดังนั้นสาธารณูปโภคเหล่านี้จะหาโปรแกรมที่อยู่ในหนึ่งในสถานที่เริ่มต้น (เช่น/bin, /usr/local/binฯลฯ ) และจะเปิดตัวโดยเพียงแค่พิมพ์ชื่อคำสั่ง

หากคุณติดตั้งที่npmอื่นเช่น/home/username/bin/npmและไดเรกทอรีนั้นไม่ได้อยู่ในของคุณPATHจะไม่พบวิธีนี้ findคุณจะต้องใช้เช่น


1
ฉันเชื่อว่าnvmในเส้นทางตั้งแต่ฉันสามารถเข้าถึงคำสั่งนี้จากไดเรกทอรีใด ๆ
Vitalii Korsakov

whichbashสามารถล้มเหลวที่จะหาสิ่งที่อยู่ในเส้นทางในบางกรณีเมื่อใช้ ดูคำตอบของ @ Pathogen ด้านบน
CXJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.