Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Linux 跟踪移动的shell脚本_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux 跟踪移动的shell脚本

Linux 跟踪移动的shell脚本,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我希望有人能帮助我。在过去的一个多月里,我一直在学习Bash。。。我有一个程序(一个简单的语言学习程序),我希望能够安装并从脚本运行 我有一个脚本,它将创建一个新文件夹并将自己移动到其中。我目前的做法如下所示,尽管我在以后使用的阵列中遇到了问题。我想知道是否有更干净的方法来获取文件名的新路径。任何帮助或见解都将不胜感激 #!/bin/bash echo "# path to me ---------------> ${0} " echo "# parent path -----

我希望有人能帮助我。在过去的一个多月里,我一直在学习Bash。。。我有一个程序(一个简单的语言学习程序),我希望能够安装并从脚本运行

我有一个脚本,它将创建一个新文件夹并将自己移动到其中。我目前的做法如下所示,尽管我在以后使用的阵列中遇到了问题。我想知道是否有更干净的方法来获取文件名的新路径。任何帮助或见解都将不胜感激

#!/bin/bash

echo "# path to me --------------->  ${0}     "
echo "# parent path -------------->  ${0%/*}  "
echo "# my name ------------------>  ${0##*/} "

if [[ ! -d ${0%/*}/SomeNewFolder ]] && [[ ! -d ${0%/*}/../SomeNewFolder ]]
then
    mkdir ${0%/*}/SomeNewFolder
    mv ${0} ${0%/*}/SomeNewFolder/${0##*/}
fi

echo ${0%/*}
newpath=$(echo "${0%/*}/SomeNewFolder")
echo $newpath
祝你一切顺利,本

退出

好吧,您可以这样做以获得绝对路径:

PARENTPATH=$( cd "$( dirname "$0" )" && pwd )
NEWPATH=${PARENTPATH}/SomeNewFolder

为清楚起见,我可能会为公共值声明命名变量,而不是不断重用${0}数组。引用变量和字符串也是一种很好的做法

我看到的唯一主要问题是运行./script.sh会使$0与文件名相等,因此在这种情况下,我会在开头添加“/”

#!/bin/bash -u

ME="${0}"
if [[ ! "$ME" =~ /^\// ]]; then
        ME="./$ME"
fi
PARENT="${ME%/*}"
FILENAME="${ME##*/}"
FOLDER="SomeNewFolder"
NEW="$PARENT/$FOLDER"

if [[ ! -d "$NEW" ]] && [[ "${PARENT%/*}" != "$FOLDER" ]]; then
        mkdir "$NEW"
        mv "$ME" "$NEW"
fi

echo "$PARENT"
echo "$NEW"

从make文件安装和设置程序更合适。诚然,一开始看起来很吓人,但是基本的东西,比如你想要什么,都很简单。对于您的项目,您最好有三项:

  • 你的程序
  • 你的跑步脚本
  • 您的makefile,即您的安装程序
  • 这将分解这些不同的组件,使它们更易于管理。如果同时对它们进行tar,则可以将tar文件移动到新计算机并重新安装,而无需进行任何更改。Bash是一个很好的工具,但它不是一个安装程序

    下面是制作脚本的示例:

    .PHONY: all clean
    SCRIPT=yourScriptName.sh
    SUBFOLDER=someFolder
    
    all: $(SCRIPT)
    
    $(SCRIPT): $(SUBFOLDER)
        cp $(SCRIPT) $(SUBFOLDER)    
    $(SUBFOLDER): 
        mkdir $(SUBFOLDER)
    clean:
        -rm -f $(SUBFOLDER)/$(SCRIPT)
        -rmdir $(SUBFOLDER)
    
    重要make对空格敏感!这些缩进是制表符而不是四个空格

    me="$0"
    newdir=SomeNewFolder
    
    if [[ $me =~ ^/ ]] ; then
        full_path="$me"
    else
        full_path="$PWD/$me"
    fi
    full_path="${full_path//\/\.\///}" # prettify
    
    path_to_me="${full_path%/*}"
    parent_dir="${path_to_me##*/}"
    
    if [ ! "$parent_dir" = "$newdir" ] ; then
        mkdir -p "$path_to_me/$newdir"
        mv -f "$full_path" "$path_to_me/$newdir/"
    fi
    
    基本上与lunixbochs所做的相似,但有一些小改动

  • 小写变量名,以免与环境变量混淆
  • 粗略估计绝对路径
  • -f
    -p
    因为互动从来都不酷,为什么不酷呢

  • 顺便说一下,backticks中的echo是一种反模式,除非您确切地知道为什么要这样做。另请看,这是我正在尝试解决的文件的新路径。所以在创建dir并移动到那里之后$0仅指启动文件的时间-文件是否可更新?@user969617:您希望在哪个调用上知道新路径?您不能将值分配给
    $0
    ,但是,由于我开始将其值复制到
    $me
    中,然后使用该值,可以将新值分配给该变量,如
    me=“$path_to_me/$newdir/${me###*/}”
    。现在,
    $me
    是脚本在其新位置的完整路径。我知道在本例中,脚本可以使用
    ${0}
    或目录
    ${0%/*}
    找到其路径,但我的脚本在第一次运行时会自动移动。让我们假设当我们启动脚本时,
    dir=${0%/*}
    当我们移动脚本时,我们必须使用
    dir=${0%/*}/NewFolder
    ?显然,在第二次运行脚本时,这些都不需要,因为
    dir=${0%/*}
    将起作用。
    ${0}
    能否以任何方式刷新?所以它可以在脚本移动后调用,并找到新位置?(无需使用
    /NewFile
    对其进行修改?这有意义吗?这不是一个大问题,只是一个小问题curiosity@user969617:不,这没有意义。第一次运行脚本时,
    $0
    是它的原始位置。在脚本运行期间,脚本的位置会更改,
    $0
    不会更改。在s第一次运行时,您可以使用变量
    $me
    来表示移动后的新位置,如果它如上所示移动,则分配给它。在第二次运行脚本时,变量
    $0
    显示新位置。在第二次运行脚本时,您可以将此位置称为变量
    $me
    (并且位置不会再次更改)。在任何情况下,您都不能在运行期间更改$0…而且,您不需要更改。也许“程序”是一个强有力的词。它更像是一个400行bash脚本,可以接受用户输入等。安装部分实际上只是让人们在第一次运行脚本时设置它。我试图了解$0是否可以更新。。。我可以为bash脚本使用make文件吗?“安装程序”和“程序”?我将通读manmake页面…@user969617 make可以处理任何事情,而shell脚本仍然是一个程序。:)大多数时候,个人shell脚本都会进入users~/bin文件夹,但如果你打算将其发布给其他人,那么简单的“安装程序”是一种很好的形式。