【问题标题】:How does this os x bash script that emulates linux's readlink work?这个模拟 linux 的 readlink 的 os x bash 脚本是如何工作的?
【发布时间】:2015-04-24 00:46:22
【问题描述】:

From superuser:

function abspath() {
  pushd . > /dev/null;
  if [ -d "$1" ]; then
    cd "$1";
    dirs -l +0;
  else
    cd "`dirname \"$1\"`";
    cur_dir=`dirs -l +0`;
    if [ "$cur_dir" == "/" ]; then
      echo "$cur_dir`basename \"$1\"`";
    else
      echo "$cur_dir/`basename \"$1\"`";
    fi;
  fi;
  popd > /dev/null;
}

我想使用这个脚本,但我对使用我不完全理解的东西很谨慎。

【问题讨论】:

  • 你需要找到函数dirs才能知道它的作用。
  • 您还可以将每一行/代码块复制/粘贴到终端窗口中。使用set -x 显示变量的扩展。使用set -- "/your/dir/of/interest" 设置$1 的值。祝你好运。
  • 另外,编写与readlink 命令等效的程序并不难,获取readlink 的GNU 版本并将其安装在Mac 上并不难。

标签: linux macos bash shell


【解决方案1】:

除了在语法上和语义上都没有模拟readlink(1)/stat(1) 命令的小细节之外,您还可以通过调用man bash 并搜索dirspushd 和@987654325 来获得所需的所有信息@其中的内置文档。 basenamedirname 命令也有各自的手册页,这比我解释的要好得多。

话虽如此,让我们稍微描述一下您提到的脚本:

 1  function abspath() {
 2    pushd . > /dev/null;
 3    if [ -d "$1" ]; then
 4      cd "$1";
 5      dirs -l +0;
 6    else
 7      cd "`dirname \"$1\"`";
 8      cur_dir=`dirs -l +0`;
 9      if [ "$cur_dir" == "/" ]; then
10        echo "$cur_dir`basename \"$1\"`";
11      else
12        echo "$cur_dir/`basename \"$1\"`";
13      fi;
14    fi;
15    popd > /dev/null;
16  }

一些解释:

1)定义一个shell函数 2)将当前工作目录添加到目录堆栈并更改为它 3)如果提交的参数对应一个目录 4)改变它 5) 显示当前工作目录的完整路径名 6) 否则[如果提交的参数不是目录] 7) 去掉文件名部分,从最后一个斜杠 `/' 字符开始到字符串的末尾,并切换到目录 8) 将当前工作目录的完整路径名存储到 `cur_dir` 变量中 9) 如果当前工作目录是 '/' 则 10) 使用 cur_dir 变量和提交参数的基本名称输出完整的限定路径 11) 否则 12) 使用 cur_dir 变量、`/' 和提交参数的基本名称输出完整的限定路径 13) 内部 if 块结束 14) 外部 if 块结束 15)从目录堆栈中删除当前工作目录并将其改回,实质上是回到我们调用函数的原始目录。 16)关闭shell函数定义

结合手册页和相应的 bash 内置文档,您应该了解这个 shell 函数的内部工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多