“ ♦: ไม่พบคำสั่ง” ใน tty หลังจากล็อกอิน


24

ฉันมีปัญหานี้หลังจากอัพเกรด Lubuntu จาก 12.10 เป็น 13.04

ผมกดCtrl+ Alt+ ป้อนเข้าสู่ระบบรหัสผ่านรอสองวินาทีและได้รับ:1 ♦: command not found"หลังจากข้อความนี้ฉันสามารถพิมพ์คำสั่งได้โดยไม่มีปัญหา แต่มันคืออะไร

echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/vitaly/bin:/usr/java/jdk1.7.0_17/bin

.bashrcไฟล์ของฉันคือ:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

.profileไฟล์ของฉันคือ:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

ไฟล์/etc/profileอยู่ที่นี่: http://paste.ubuntu.com/5781361/


1
อะไรคือผลลัพธ์ของecho $PATH? (โปรดแก้ไขเป็นคำถามของคุณแล้วตอบกลับ)
Seth

1
คุณสามารถอัพโหลดไฟล์ ~ / .bashrc และ ~ / .profileไปที่paste.ubuntu.comแล้วโพสต์ลิงก์ได้หรือไม่?
Eric Carvalho

สำหรับการอ้างอิงในอนาคตรูปร่างเรียกว่า "เพชร"
user98085

เพิ่มecho $PATHไปยังคำถามของฉัน
Vitaly Zdanevich

หากคุณใช้เครื่องหมายคำพูดเดี่ยวรอบ ๆ ตัวแปรพา ธ ของคุณใน '.bashrc' อาจทำให้เกิดปัญหานี้ได้
phyatt

คำตอบ:


28

วิธีแก้ปัญหา

ครั้งแรกผมคิดว่าคุณหมายถึงเมื่อคุณไปใน tty1 Ctrl- Alt+ F1+

ตอนนี้ผมคิดว่าเป็นสิ่งที่เกิดขึ้นสิ่งที่คุณกล่าวว่าส่วนใหญ่อาจเป็นเพราะคุณมีลักษณะที่แปลกประหลาดเช่น♦ ( ตัวอักษรเพชรชุดสูทหรือป้ายพิเศษสำหรับผู้ดูแล askubuntu ) ใน~/.bashrcหรือ~/.profileไฟล์หรือไฟล์อื่น ๆ ที่มีคำสั่งเริ่มต้นต่างๆ

อย่างที่คุณเห็นในภาพถัดไปฉันแก้ไข~/.bashrcไฟล์ที่ใส่ข้างใน♦ตัวละครในบรรทัดเดียว ดังนั้นเมื่อเปิดเทอร์มินัลจะพบปัญหาอธิบายโดยคุณ:

สถานีปลายทาง

มันเป็นเรื่องที่เกิดขึ้นเช่นเดียวกันเมื่อฉันไปใน tty1 กับCtrl+ +AltF1

ไฟล์ที่มีการเริ่มต้นคำสั่งเมื่อเปลือกถูกเรียก: /etc/profile, /etc/bashrc, ~/.bash_login, ~/.profile, ~/.bashrc, ~/.bash_aliasesและอาจจะคนอื่น ๆ ดูไฟล์เริ่มต้นเชลล์

หากต้องการตรวจสอบอย่างรวดเร็วว่าไฟล์ใดไฟล์หนึ่งมีข้อผิดพลาดภายในคุณสามารถใช้sourceคำสั่ง ตัวอย่างเช่น:

source ~/.bashrc

โปรไฟล์ต้นทาง

ทางออกสุดท้าย

หลังจากตรวจสอบ/etc/profileจากhttp://paste.ubuntu.com/5781361/ฉันพบว่าในบรรทัดที่ 31 มี"Right-To-Left Override" -‮ตัวอักษรยูนิโค้ด เพียงแค่เปิด/etc/profileไฟล์ด้วยsudo -H gedit /etc/profileให้แน่ใจว่าได้ลบตัวละครแปลก ๆ และปัญหาจะหายไป

ไฟล์โปรไฟล์

ยกตัวอย่างเช่นในรูปแบบ HTML หากคุณแทรกอักขระยูนิโค้ดนี้โดยใช้รหัสทศนิยม ( ‮) หน้าบรรทัดให้ดูสิ่งที่เกิดขึ้น:

ข้อความนี้เป็นภาษาอารบิก - อังกฤษ!

อีกวิธีการแก้ปัญหาทั่วไปมากขึ้น

เราจะพบคำสั่งที่แน่นอนที่ทำให้เกิดข้อผิดพลาดโดยใช้ " กับดัก "

อันดับแรกเราต้องสร้างไฟล์สคริปต์ใหม่ใน~/binไดเรกทอรีลองเรียกมันว่าlib.trap.sh( gedit ~/bin/lib.trap.sh) โดยทำตามข้างใน:

lib_name='trap'

lib_version=20130620
#changed from lib_version=20121026 found it at /programming//a/13099228/2353900 to work well at initialization of the shell

stderr_log="/dev/shm/stderr.log"

#
# TO BE SOURCED ONLY ONCE:
#
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##

if test "${g_libs[$lib_name]+_}"; then
    return 0
else
    if test ${#g_libs[@]} == 0; then
        declare -A g_libs
    fi
    g_libs[$lib_name]=$lib_version
fi


#
# MAIN CODE:
#
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##

set -o pipefail  # trace ERR through pipes
set -o errtrace  # trace ERR through 'time command' and other functions
set -o nounset   ## set -u : exit the script if you try to use an uninitialised variable
set -o errexit   ## set -e : exit the script if any statement returns a non-true return value

exec 2>"$stderr_log"


###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
#
# FUNCTION: EXIT_HANDLER
#
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##

function exit_handler ()
{
    local error_code="$?"

    test $error_code == 0 && return;

    #
    # LOCAL VARIABLES:
    # ------------------------------------------------------------------
    #    
    local i=0
    local regex=''
    local mem=''

    local error_file=''
    local error_lineno=''
    local error_message='unknown'

    local lineno=''


    #
    # PRINT THE HEADER:
    # ------------------------------------------------------------------
    #
    # Color the output if it's an interactive terminal
    test -t 1 && tput bold; tput setf 4                                 ## red bold
    echo -e "\n(!) EXIT HANDLER\n"


    #
    # GETTING LAST ERROR OCCURRED:
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #

    #
    # Read last file from the error log
    # ------------------------------------------------------------------
    #
    if test -f "$stderr_log"
        then
            stderr=$( tail -n 1 "$stderr_log" )
            rm "$stderr_log"
    fi

    #
    # Managing the line to extract information:
    # ------------------------------------------------------------------
    #

    if test -n "$stderr"
        then        
            # Exploding stderr on :
            mem="$IFS"
            local shrunk_stderr=$( echo "$stderr" | sed 's/\: /\:/g' )
            IFS=':'
            local stderr_parts=( $shrunk_stderr )
            IFS="$mem"

            # Storing information on the error
            error_file="${stderr_parts[0]}"
            error_lineno="${stderr_parts[1]}"
            error_message=""

            for (( i = 3; i <= ${#stderr_parts[@]}; i++ ))
                do
                    error_message="$error_message "${stderr_parts[$i-1]}": "
            done

            # Removing last ':' (colon character)
            error_message="${error_message%:*}"

            # Trim
            error_message="$( echo "$error_message" | sed -e 's/^[ \t]*//' | sed -e 's/[ \t]*$//' )"
    fi

    #
    # GETTING BACKTRACE:
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
    _backtrace=$( backtrace 2 )


    #
    # MANAGING THE OUTPUT:
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #

    local lineno=""
    regex='^([a-z]{1,}) ([0-9]{1,})$'

    if [[ $error_lineno =~ $regex ]]

        # The error line was found on the log
        # (e.g. type 'ff' without quotes wherever)
        # --------------------------------------------------------------
        then
            local row="${BASH_REMATCH[1]}"
            lineno="${BASH_REMATCH[2]}"

            echo -e "FILE:\t\t${error_file}"
            echo -e "${row^^}:\t\t${lineno}\n"

            echo -e "ERROR CODE:\t${error_code}"             
            test -t 1 && tput setf 6                                    ## white yellow
            echo -e "ERROR MESSAGE:\n$error_message"


        else
            regex="^${error_file}\$|^${error_file}\s+|\s+${error_file}\s+|\s+${error_file}\$"
            if [[ "$_backtrace" =~ $regex ]]

                # The file was found on the log but not the error line
                # (could not reproduce this case so far)
                # ------------------------------------------------------
                then
                    echo -e "FILE:\t\t$error_file"
                    echo -e "ROW:\t\tunknown\n"

                    echo -e "ERROR CODE:\t${error_code}"
                    test -t 1 && tput setf 6                            ## white yellow
                    echo -e "ERROR MESSAGE:\n${stderr}"

                # Neither the error line nor the error file was found on the log
                # (e.g. type 'cp ffd fdf' without quotes wherever)
                # ------------------------------------------------------
                else
                    #
                    # The error file is the first on backtrace list:

                    # Exploding backtrace on newlines
                    mem=$IFS
                    IFS='
                    '
                    #
                    # Substring: I keep only the carriage return
                    # (others needed only for tabbing purpose)
                    IFS=${IFS:0:1}
                    local lines=( $_backtrace )

                    IFS=$mem

                    error_file=""

                    if test -n "${lines[1]}"
                        then
                            array=( ${lines[1]} )

                            for (( i=2; i<${#array[@]}; i++ ))
                                do
                                    error_file="$error_file ${array[$i]}"
                            done

                            # Trim
                            error_file="$( echo "$error_file" | sed -e 's/^[ \t]*//' | sed -e 's/[ \t]*$//' )"
                    fi

            echo -e "ROW, FILE:\t\t${lines[2]   }\n"

                    echo -e "ERROR CODE:\t${error_code}"
                    test -t 1 && tput setf 6                            ## white yellow
                    if test -n "${stderr}"
                        then
                            echo -e "ERROR MESSAGE:\n${stderr}"
                        else
                            echo -e "ERROR MESSAGE:\n${error_message}"
                    fi
            fi
    fi

    #
    # PRINTING THE BACKTRACE:
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #

    test -t 1 && tput setf 7                                            ## white bold
    echo -e "\n$_backtrace\n"

    #
    # EXITING:
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #

    test -t 1 && tput setf 4                                            ## red bold
    echo "Exiting!"

    test -t 1 && tput sgr0 # Reset terminal

    exit "$error_code"
}
trap exit_handler ERR                                                  # ! ! ! TRAP EXIT ! ! !
#trap exit ERR                                                        # ! ! ! TRAP ERR ! ! ! 


###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##
#
# FUNCTION: BACKTRACE
#
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##

function backtrace
{
    local _start_from_=0

    local params=( "$@" )
    if (( "${#params[@]}" >= "1" ))
        then
            _start_from_="$1"
    fi

    local i=0
    local first=false
    while caller $i > /dev/null
    do
        if test -n "$_start_from_" && (( "$i" + 1   >= "$_start_from_" ))
            then
                if test "$first" == false
                    then
                        echo "BACKTRACE IS:"
                        first=true
                fi
                caller $i
        fi
        let "i=i+1"
    done
}

return 0

ตอนนี้สิ่งเดียวที่คุณต้องทำคือใส่บรรทัดถัดไปที่จุดเริ่มต้นของไฟล์/etc/profile( sudo -H gedit /etc/profile):

source '/home/<user_name>/bin/lib.trap.sh'

เปลี่ยน<user_name>ด้วยชื่อผู้ใช้ของคุณ เช่นนี้ไฟล์ทั้งหมดที่มีคำสั่งเริ่มต้นเมื่อเชลล์ถูกเรียกจะผ่าน "กับดัก"

หากต้องการทดสอบว่ามีคำสั่งที่ไม่ถูกต้อง/etc/profileให้รันในคำสั่ง next terminal หรือไม่:

bash source / etc / profile

หากมีสิ่งผิดปกติเช่นในกรณีนี้ผลลัพธ์จะเป็น:

กับดัก

ดังนั้นตอนนี้เรารู้แล้วว่ามีปัญหา ( command not found) ใน/etc/profileไฟล์ที่บรรทัดที่ 32 (ไม่อยู่ที่บรรทัดที่ 31 ดังกล่าวข้างต้นเพราะเราได้แทรกบรรทัดใหม่ที่จุดเริ่มต้นของไฟล์)

ขอบคุณLuca Borrioneสำหรับบทของเขาจากคำตอบนี้ที่ช่วยให้ฉันทำวิธีการแก้ปัญหาทั่วไปให้เสร็จสมบูรณ์


เพิ่มรหัสจาก.bashrcและ.profileคำถาม - ฉันไม่พบ♦ที่นี่
Vitaly Zdanevich

1
@VitalyZdanevich คุณควรตรวจสอบไฟล์ทั้งหมดที่มีคำสั่งเริ่มต้น ( .bash_aliases, .pam_environmentและอื่น ๆ ) เพื่อหาสิ่งแปลก ๆ ภายในไม่จำเป็นต้องตรงกับตัวละครตัวนี้
Radu Rădeanu

2
ใช่ปัญหาคือในบรรทัดที่ 31 /etc/profileจาก คุณมีสิ่งที่แปลกมากที่นั่น เพียงแค่ลบระหว่างสิ่งที่เคยทำfiและJAVA_HOMEหลังจากกดหนึ่งหรือสอง 'Enter' และทุกอย่างจะโอเคหลังจากนั้น แก้ไขไฟล์ด้วยsudo gedit /etc/profile
Radu Rădeanu

1
@RyanLoremIpsum ไม่ฉันแน่ใจ สหกรณ์ได้วางมีไม่ฉัน :)
Radu Rădeanu

1
ที่ดี! /etc/profileฉันจะล้างนี้สองเส้นโปร่งใสในการ กระเป๋าแปลก ๆ
Vitaly Zdanevich

5

สำหรับการดีบักสคริปต์การเริ่มต้นของ bash ให้เรียกใช้สิ่งต่อไปนี้ (หลังจากลงชื่อเข้าใช้ที่คอนโซลเสมือน)

PS4='+ $BASH_SOURCE:$LINENO:' bash -xlic ''

ข้างต้นจะรันทุบตีในโหมด-iเข้าสู่ระบบ ( -l) แบบโต้ตอบเช่นเดียวกับloginโปรแกรมเมื่อคุณเข้าสู่คอนโซลเสมือน -c ''ทำให้ออกทันทีหลังจากรันสคริปต์เริ่มต้นและ-xและPS4=...ทำให้เอาต์พุตแต่ละคำสั่งก่อนที่จะรันพร้อมกับชื่อไฟล์และหมายเลขบรรทัดของคำสั่งนั้น ซึ่งจะช่วยในการพิจารณาว่าไฟล์ใดที่มีคำสั่งไม่ถูกต้องอยู่

ในหมายเหตุด้านข้าง♦เป็นสัญลักษณ์ที่เป็นแบบอักษรเริ่มต้นสำหรับคอนโซลเสมือนที่ใช้พิมพ์ตัวอักษรที่ไม่มีสัญลักษณ์


1

ในขณะที่ค้นหาไฟล์การเริ่มต้นของคุณอาจเป็นประโยชน์ในการค้นหาเลขฐานสิบหกที่ใช้สำหรับการแสดงผล♦ รหัสฐานสิบหกสำหรับ♦เป็น 2666 ตามอักขระ Unicode 'เพชรดำชุด' หมายเหตุ:มีอย่างน้อยหนึ่งรหัสฐานสิบหกอื่น ๆ คือ 25C6 ซึ่งสร้างสัญลักษณ์การค้นหาที่เหมือนกันหรือคล้ายกัน ดูผลการค้นหาสำหรับ "diamond" การค้นหาอักขระ Unicode

บางทีสิ่งที่ชอบ\u2666อยู่ในสคริปต์อย่างใดอย่างหนึ่ง จากคู่มืออ้างอิง Bash สำหรับ echo - "\ uhhhh the Unicode (ISO / IEC 10646) ตัวละครที่มีค่าเป็นค่าเลขฐานสิบหก HHHH (หนึ่งถึงสี่หลักสิบหกหลัก)"

ขึ้นอยู่กับการเข้ารหัสของอักขระที่ใช้ดังนั้นคุณอาจต้องการค้นหาสิ่งที่น่าจะเป็นอันดับแรก echo $LC_CTYPEควรคืนค่าการเข้ารหัสอักขระที่ใช้โดยเชลล์ของคุณ ดูวิธีรับการเข้ารหัสอักขระของเทอร์มินัล


-1 เพราะใน~/.bash_historyจะถูกเก็บไว้คำสั่ง runned แบบโต้ตอบบน PS1
Radu Rădeanu

ขอบคุณสำหรับการยืนยัน ฉันลบมันแล้ว ฉันควรเพิ่มส่วนที่เหลือเป็นข้อคิดเห็นในคำตอบของคุณ Radu หรือไม่?
iyrin

โอ้ฉันไม่เข้าใจ - ฉันต้องทำอย่างไร ไฟล์เริ่มต้นของ Lubuntu อยู่ที่ไหน? ฉันพยายามค้นหาข้อความแบบเต็ม\u2666และ♦ใน Catfish (ค้นหา Lubuntu) - ไม่มีอะไร ฉันhistoryไม่ได้ทำอะไรเลย ฉันเห็นข้อความนี้เฉพาะใน tty เท่านั้นหลังจากเข้าสู่ระบบ หลังจากที่echo $LC_CTYPEฉันได้รับบรรทัดว่างเปล่า
Vitaly Zdanevich

การทำงานlocaleควรแสดง LC_CTYPE locale
iyrin

ลองคำตอบของ Radu ก่อนหน้านี้! หากเรา จำกัด ชุดอักขระที่ใช้ใน tty ของคุณให้แคบลงคุณสามารถค้นหาการเกิดขึ้นของรหัสอักขระที่สอดคล้องกันสำหรับเพชรที่เป็นของแข็ง การค้นหานี้จะพิสูจน์แล้วว่าไร้ประโยชน์หาก RLO ของ Radu พบว่าเป็นสาเหตุ
iyrin

0

เขียนพา ธ แบบเต็มไปยังเครื่องมือที่รู้จักซึ่งจะช่วยให้คุณแก้ไขไฟล์ bashrc ของคุณพร้อมกับพา ธ แบบเต็มไปยังไฟล์ bashrc ของคุณ

/bin/nano /home/username/.bashrc

ค้นหาสิ่งที่ไม่เหมาะสมต่อPATHตัวแปรของคุณและแสดงความคิดเห็น ดูเหมือนว่าเมื่อพยายามเพิ่มบางสิ่งลงในพา ธ ของคุณมันจะเป็นการอ้างอิงแบบเดี่ยวแทนที่จะเป็นการอ้างอิงแบบสองครั้ง

PATH='$PATH:/path/to/new/tool' # very BAD, single quotes won't expand PATH
#    ^                       ^

PATH="$PATH:/path/to/new/tool" # Good! The double quotes allow variable expansion

คัดลอก. bashrc ของคุณลงในเครื่องมือเช่นhttps://www.shellcheck.net/เพื่อดูว่าคุณมีปัญหาในการใช้ bash หรือไม่

หวังว่าจะช่วย

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