当我将它们移至特定目录时,Shell脚本条目(path()会更改

时间:2019-03-12 08:27:11

标签: shell

我有一条路说=========================

/ nfs / old_home / dexter / work / Deamon / Test2 / IN /

在此路径中,我有脚本文件说: Files1.sh Files2.sh Flles3.sh ....

Filesn.sh

每个脚本文件都有一行说来

export DATABASE_XML = / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 / RDB.xml

================================================ ====== 假设第一个路径(即/ nfs / old_home / dexter / work / Deamon / Test2 /)具有此RDB.xml文件和该脚本文件中给定的路径,即 导出DATABASE_XML = ** / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 / ** RDB.xml 是链接路径。

因此,如果我将脚本文件从 / nfs / old_home / dexter / work / Deamon / Test2 / IN /到/ nfs / old_home / dexter / work / Deamon / Test3 / IN /,因此它应该读取/ nfs / old_home / dexter / work的RDB.xml文件/ Deamon / Test3 /目录,而不是Test2..in,用一个简单的单词表示脚本内的路径 导出DATABASE_XML = / mnt / nfs / lin_work_live / linear_work / dexter / Deamon / Test2 /RDB.xml 应该更改为Test3,此更改也应反映在我移动的所有File1.sh ... FileN.sh文件中。 希望现在已经清楚了吗?

1 个答案:

答案 0 :(得分:1)

问题重述

  • 文件夹/orig中有一些文件
    • 有一个配置文件/orig/conf
    • 有一些脚本/orig/IN/script1 .. /orig/IN/scriptN
      • 每个脚本包含一行:export VAR="/orig-sym/conf"
    • /orig-sym是指向/orig的符号链接
  • 将文件复制到新文件夹/new
    • 配置文件从/orig/conf移至/new/conf
    • 脚本从/orig/IN/scriptX移至/new/IN/scriptX
      • 将相关行更改为export VAR="/new-sym/conf"
    • /new-sym是指向/new的符号链接

解决方案1 ​​

在文件scriptX被移动后进行搜索并替换。

可以使用类似sed -i s/find/replace/ file*的方法,但是必须注意确保replace不包含特殊的字符(例如/[等)。安全地引用这些内容可能会很复杂。

但是,我们可以回避该问题。例如,使用shell和perl:

$ mkdir "/new"
$ ln -s "/new" "/new-sym"
$ cp -R "/orig/." "/new"
$ perl -i -pe '
  BEGIN { $replacement = shift }
  s/^(export VAR)=.*/$1="$replacment"/
' "/new-sym" "/new/IN/"script*
  • 创建新文件夹及其符号链接
  • 将文件复制到新文件夹中
  • 运行perl脚本进行搜索和替换
    • 第一个参数是替换符号链接路径(/new-sym
    • 剩余的参数是要更改的文件
    • -i覆盖文件
    • BEGIN复制了新路径,避免了复杂的转义
    • s///执行替换
      • 注意::检查是否只有所需的行匹配

解决方案2

请勿使用绝对路径。

由于配置文件始终是脚本的上一级,因此不需要更改相对路径。

如果脚本直接执行,则$0应包含其路径。 因此,在许多情况下,类似这样的方法将起作用:

#!/bin/sh
# scriptX

# ...
# commands that must not include "cd", "pushd", etc
# ...

top=$(dirname -- "$0")
absolute_top=$(CDPATH= cd -- "$top" && pwd -P)

# ...
# commands that may include "cd", "pushd", etc
# ...

export VAR="$(absolute_top)/../conf