【问题标题】:getting folder paths in bash scripts to work on windows在 bash 脚本中获取文件夹路径以在 Windows 上工作
【发布时间】:2016-12-27 23:27:51
【问题描述】:

我有一个通常可以在 linux 中运行的脚本,但我正在尝试使其也可以在 Windows 上运行。

脚本基本上是调用一些其他程序,然后移动很多文件。

问题是所有路径都是使用普通斜杠 (/) 完成的,但是当我尝试使用 cmder 运行脚本时,例如 sh path/to/script/script.sh param 它找不到东西,因为它最终混合了斜杠: Unable to access jarfile C:\full\path\to\file/here/are/normal/slashes/javafile.jar 等等。

假设,当我编辑 java 文件以使用两种操作系统路径时,我将斜杠的连接更改为使用 java.nio.file.Paths.get 以获得正确的路径。

有没有办法在 bash 上做类似的事情?

f.e.如果我有jarpath=../path/to/jar,类似于jarpath=correct_os_path(../path/to/jar)

【问题讨论】:

  • Windows 理解正斜杠。你能把你的脚本改成/full/path/to/file/here/are/normal/slashes/javafile.jar这样的东西吗?
  • 问题是我希望脚本同时在 windows 和 linux 上工作,我不想维护两个脚本。

标签: linux windows bash shell path


【解决方案1】:

要将斜杠更改为操作系统的正确类型,请尝试:

fixpath() {
    case "$OSTYPE" in
        *(linux|darwin|bsd)*) echo "${1//\\/\/}" ;;
        *win*) echo "${1//\//\\}" ;;
    esac
}

上面有一个名为fixpath的bash函数。该函数使用 bash 的 OSTYPE 变量来确定操作系统,然后使用 bash 的 模式替换 将斜杠更改为反斜杠,反之亦然。

例如,在 Linux 上运行时:

$ fixpath '\a\b\c/d/e'
/a/b/c/d/e

在您的用例中:

jarpath="$(fixpath "../path/to/jar")"

限制

在 Unix 上,文件或目录名称可以包含文字 \。要使 Unix-Windows 转换可靠地工作,请尽量避免使用此类名称。

【讨论】:

  • 嘿伙计,我似乎没有 OSTYPE 变量。我添加了一个默认情况,它会回显“hello world”,实际上我确实得到了 hello world。另外,(linux|darwin|bsd) 中的括号会发出语法错误,所以我删除了它们。
  • @GioraGuttsait 从你告诉我的情况来看,你没有使用bash。在 linux 方面,您使用的是哪个发行版?你是如何调用 shell 脚本的?在命令提示符下,运行 echo $OSTYPE 并告诉我响应是什么。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 2013-03-17
  • 1970-01-01
  • 2011-12-08
  • 2021-11-13
  • 2014-03-27
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多