通过第二个名称调用函数(作业)

mik*_*ike 5 linux scripting hard-link filenames

我正在编写一个名为的函数restore,它将文件从备份目录复制到当前目录。我现在需要创建一个硬链接来恢复,以便它可以被称为purge. 我将如何实现它以便我可以在将恢复称为清除时使用该if语句if [ "$0" = "purge" ]

这是我的代码,虽然我会缩短它,因为我已经测试过它(它有效):

restore(){
if [ "$1" = "-p" ] || [ "$0" = "purge" ]; then
while [ ! ]
    do
    #Purge code, etc...
    done


elif [ "$1" != "-p" ]; then
select fname in $(find /$HOME/Backup -name "$1*" | sed 's!.*/!!' | sed 's!$1!!') quit
        do
             #If restore is called with an argument code...
        done

local newfname=$(echo "$fname"|sed -E 's/[0-9]{11}$//')
cp -i "/$HOME/Backup/$fname" "$newfname"
exit 0
fi

while [ ! ]
do
fname=""
select fname in $(ls /$HOME/Backup) quit
        do
            #Restore with no arguments code...
        done

local newfname=$(echo "$fname"|sed -E 's/[0-9]{11}$//')
cp -i "/$HOME/Backup/$fname" "$newfname"
done
}
Run Code Online (Sandbox Code Playgroud)

使用该-p选项调用 restore 与调用 restore as purge 相同。那么我将如何实现代码以便可以通过使用清除来调用恢复?

它应该是一个脚本而不是一个函数。我做了一个到Restore.shnamed的硬链接Purge.sh,但是当我使用 ./Purge.sh 调用它时,它仍然运行标准的恢复代码。如何确定硬链接文件是否调用了恢复?

jes*_*e_b 8

这会是作弊吗?在您的恢复脚本中,您仍然拥有您的-p逻辑,然后您创建一个单独的清除功能,如下所示:

purge () { /path/to/restore.sh -p "$@"; }
Run Code Online (Sandbox Code Playgroud)

在您的恢复脚本中,您应该将它的函数包装器取出来,否则我相信它本质上只是来源而不是执行。


Min*_*Max 5

做硬链接到restore.sh

ln restore.sh link_to_restore.sh
Run Code Online (Sandbox Code Playgroud)

restore.sh文件内容:

#!/bin/bash

if [ "$0" = "./link_to_restore.sh" ]; then
    echo foo
elif [ "$0" = "./restore.sh" ]; then
    echo bar
fi
Run Code Online (Sandbox Code Playgroud)

测试

$ ./restore.sh 
bar
$ ./link_to_restore.sh 
foo
Run Code Online (Sandbox Code Playgroud)

  • 如果我使用绝对路径 (`/path/to/restore.sh`) 调用脚本,这将不起作用 (3认同)
  • 您可以使用正则表达式检查它是否真正匹配,例如`*\/restore\.sh`。 (2认同)