【问题标题】:bash script calling ls worked perfectly until I renamed the directory the script runs in调用 ls 的 bash 脚本运行良好,直到我重命名了脚本运行的目录
【发布时间】:2020-05-16 11:28:19
【问题描述】:

我在 /home/maxg/SpProData 中编写了一个 bash 脚本。它运行得很好。 脚本的目标机器目录称为 /home/maxg/sppro

为了在编写脚本的机器上测试脚本,我将它从 /home/maxg/SpProData 重命名为 /home/maxg/sppro。

我更改了脚本的主目录变量,现在它卡在将 ls 命令结果传递给变量的位置,如下所示:

_WORKING_ZIP=$(ls -td ${_SP_LINK_CFG_FILENAME}_${_PERF_DIR_NAME_PREFIX}Archive_${_TODAY_VARIANT}_* | head -1)

导致:

[info ] Looking for the PerformanceDataArchive (.zip) file ...
find ............. ArgyleCourt_PerformanceDataArchive_2020-05-09_*
ls: cannot access 'ArgyleCourt_PerformanceDataArchive_2020-05-09_*': No such file or directory
[error] (2) = ls had a more serious problem; e.g. directory or file not found... exiting!

常量是:

SP-LINK cfg file name...: ArgyleCourt
Perf DIR name prefix....: PerformanceData
Today variant...........: 2020-05-09
SP PRO directory........: /home/maxg/sppro

文件存在:

drwxrwxr-x  3 maxg maxg  4096 May 16 19:59 .
drwxr-xr-x 56 maxg maxg  4096 May 16 19:33 ..
-rw-r--r--  1 maxg maxg 55477 May  9 02:03 ArgyleCourt_PerformanceDataArchive_2020-05-09_02-03-07.zip
-rw-rw-r--  1 maxg maxg 56208 May 15 22:27 GetSpProData.awk
-rw-rw-r--  1 maxg maxg  1511 May 16 19:52 GetSpProData.conf
-rwxrwxr-x  1 maxg maxg 23530 May 16 20:04 GetSpProData.sh

在终端运行命令返回想要的结果:

ls ArgyleCourt_PerformanceDataArchive_2020-05-09_*
ArgyleCourt_PerformanceDataArchive_2020-05-09_02-03-07.zip

这根本没有意义。仅进行了两项更改:

  1. 重命名目录
  2. 将主目录常量更改为指向新名称。

...稍后:

我将目录名称(和变量)改回 SpProData,同样无效。

...稍后:

将脚本复制到目标机器并运行! (看起来是个漫长的夜晚):(

【问题讨论】:

标签: bash shell ls


【解决方案1】:

您提供的是相对路径而不是绝对路径。

试试


_WORKING_ZIP=$(ls -td /home/maxg/sppro/${_SP_LINK_CFG_FILENAME}_${_PERF_DIR_NAME_PREFIX}Archive_${_TODAY_VARIANT}_* | head -1)

编辑:也不要parse ls

你可以使用


_WORKING_ZIP=$(head -1 <<< /home/maxg/sppro/${_SP_LINK_CFG_FILENAME}_${_PERF_DIR_NAME_PREFIX}Archive_${_TODAY_VARIANT}_*)

例子:

$ls my_file_is_here.txt
ls: cannot access 'my_file_is_here.txt': No such file or directory
$ls ~/test/my_file_is_here.txt
/home/renegade/test/my_file_is_here.txt
$cd ~/test/
$ls my_file_is_here.txt
my_file_is_here.txt
$

【讨论】:

  • 脚本有 600 行,太长无法发布……但绝对路径可以防止在“那个”位置出现问题。该脚本转换了一堆文件,因此有很多路径,而 cd 是使用相对路径的惰性方法。顺便说一句:为什么不解析 ls?
  • 哦,这些小怪癖! :) :(
【解决方案2】:

嗯...感谢您的阅读,很抱歉耽误您的时间。

只有两个变化?! NO...三个变化...

我把声明往上移了,是的,越早越好……

cd $_SP_PRO_DIR

... 太早了!在读取配置文件之前,它定义了这个常量。

这导致了一个没有参数的 cd 语句。 没有参数的 cd 会上升到父级。

因此 ls 命令找不到文件。

嗯,又学到了一个惨痛的教训。 :)

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2017-01-11
    • 2021-03-20
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多