Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何执行位于$PATH中的文件_Bash_Shell_Ubuntu - Fatal编程技术网

Bash 如何执行位于$PATH中的文件

Bash 如何执行位于$PATH中的文件,bash,shell,ubuntu,Bash,Shell,Ubuntu,我正试图从存储在我的~/Desktop的脚本中执行存储在~/bin的hello\u word.sh。我已使这两个脚本都可执行。但一直以来我都得到了问题的信息。有什么想法吗 #!/bin/sh clear dir="$PATH" read -p "which file you want to execute" fl echo "" for fl in $dir do if [ -x "$fl" ] then echo "executing=====>"

我正试图从存储在我的
~/Desktop
的脚本中执行存储在
~/bin
hello\u word.sh
。我已使这两个脚本都可执行。但一直以来我都得到了问题的信息。有什么想法吗

#!/bin/sh

clear
dir="$PATH"
read -p "which file you want to execute" fl
echo ""
for fl in $dir
do
    if [ -x "$fl" ]
    then
        echo "executing=====>"
        ./$fl
    else
        echo "Problem"
    fi
done

这条线有两个问题:

for fl in $dir
  • $PATH以冒号分隔,但的
    要求以空格分隔的值。您可以通过设置
    IFS
    变量来改变这一点。这将更改
    for
    awk
    等工具使用的字段分隔符

  • $fl
    包含要执行的文件的名称,但您用$dir的内容覆盖其值

  • 固定的:

    #!/bin/sh
    
    clear
    read -p "which file you want to execute" file
    echo
    IFS=:
    for dir in $PATH ; do  
        if [ -x "$dir/$file" ]
        then
            echo "executing $dir/$file"
            exec "$dir/$file"
        fi
    done
    echo "Problem"
    

    这条线有两个问题:

    for fl in $dir
    
  • $PATH以冒号分隔,但
    要求以空格分隔的值。您可以通过设置
    IFS
    变量来改变这一点。这将更改
    for
    awk
    等工具使用的字段分隔符

  • $fl
    包含要执行的文件的名称,但您用$dir的内容覆盖其值

  • 固定的:

    #!/bin/sh
    
    clear
    read -p "which file you want to execute" file
    echo
    IFS=:
    for dir in $PATH ; do  
        if [ -x "$dir/$file" ]
        then
            echo "executing $dir/$file"
            exec "$dir/$file"
        fi
    done
    echo "Problem"
    

    你也可以懒惰,让一个子shell来处理它

    PATH=(whatever) bash command -v my_command
    if [ $? -ne 0 ]; then
       # Problem, could not be found.
    else
       # No problem
    fi
    
    没有必要把事情复杂化


    command(1)是一个内置命令,允许您检查命令是否存在。

    您也可以懒惰,让子shell处理它

    PATH=(whatever) bash command -v my_command
    if [ $? -ne 0 ]; then
       # Problem, could not be found.
    else
       # No problem
    fi
    
    没有必要把事情复杂化


    命令(1)是一个内置命令,允许您检查命令是否存在。

    路径值包含可执行文件在其中运行而无需显式限定的所有目录。所以你可以直接调用命令

    #!/bin/sh
    
    clear
    # r for raw input, e to use readline, add a space for clarity
    read -rep "Which file you want to execute? " fl || exit 1
    echo ""
    "$fl" || { echo "Problem" ; exit 1 ; }
    
    我引用这个名字,因为它可能有空格

    要在执行之前测试命令是否存在,请使用-p类型

    #!/bin/sh
    
    clear
    # r for raw input, e to use readline, add a space for clarity
    read -rep "Which file you want to execute? " fl || exit 1
    echo ""
    type -p "$fq" >/dev/null || exit 1
    "$fl" || { echo "Problem" ; exit 1 ; }
    

    路径值包含可执行文件在其中运行而无需显式限定的所有目录。所以你可以直接调用命令

    #!/bin/sh
    
    clear
    # r for raw input, e to use readline, add a space for clarity
    read -rep "Which file you want to execute? " fl || exit 1
    echo ""
    "$fl" || { echo "Problem" ; exit 1 ; }
    
    我引用这个名字,因为它可能有空格

    要在执行之前测试命令是否存在,请使用-p类型

    #!/bin/sh
    
    clear
    # r for raw input, e to use readline, add a space for clarity
    read -rep "Which file you want to execute? " fl || exit 1
    echo ""
    type -p "$fq" >/dev/null || exit 1
    "$fl" || { echo "Problem" ; exit 1 ; }
    

    您可能希望通过解释IFS分隔符变量以及为什么它对该脚本的工作如此重要来改进答案。您可能希望通过解释IFS分隔符变量以及为什么它对该脚本的工作如此重要来改进答案。您应该使用
    ~/bin
    $HOME/bin
    来代替
    /bin
    ,与
    /Desktop
    类似,您是否应该使用
    ~/bin
    $HOME/bin
    代替
    /bin
    ,与
    /Desktop
    类似?