bash 中如何使用字符串路径?

How are string paths used in bash?

上下文:我想将一个 Android 项目迁移到 AndroidX。 Android Studio 中有一个工具可以自动执行此操作,但效果不是很好。 并且我找到了一个脚本,用一个文本文件替换项目中的所有引用以映射它们。

我想在 Windows 中 运行 一个 bash 脚本。我正在使用 Ubuntu TLS,并在 Windows 中启用了 属性 配置。脚本是:

MAPPING_FILE=C:\Users\name\Desktop\androidx-class-mapping.csv
PROJECT_DIR=C:\Proyectos\Proyecto STH trunk

replace=""
while IFS=, read -r from to
do
    replace+="; s/$from/$to/g"
done <<< "$(cat $MAPPING_FILE)"

find $PROJECT_DIR \( -name "*.kt" -o -name "*.java" -o -name "*.xml" \) -type f -not -path '*/\.git*' -print0 | xargs -0 gsed -i "$replace"

当我 运行 bash 中的脚本时,我得到:

./script.sh: line 15: STH: command not found
cat: 'C:/Users/aperez/Desktop/androidx-class-mapping.csv': No such file or directory
xargs: gsed: No such file or directory

我不是很喜欢 Linux 系统,但我记得一些关于带空格的字符串。我试过在路径上加上引号 ("C:\...") 以避免将其解释为命令,但没有用。关于第二行错误:该文件确实存在于该路径中。我无法识别第三个错误。 我在 bash 中搜索了字符串的用法,但我无法让它工作,我将不胜感激!

第一个错误:double-quote参数扩展以避免在空格处分词:


find "$PROJECT_DIR" ...

第二个错误:我很惊讶你得到这个错误。应该是:

cat: 'C:UsersaperezDesktopandroidx-class-mapping.csv': No such file or directory

因为您的 MAPPING_FILE 作业中的反斜杠应该被丢弃。使用 single-quotes 保留反斜杠:

MAPPING_FILE='C:\Users\name\Desktop\androidx-class-mapping.csv'

同样适用于PROJECT_DIR赋值; single-quote它:

PROJECT_DIR='C:\Proyectos\Proyecto STH trunk'

并将done <<< "$(cat $MAPPING_FILE)"替换为done < "$MAPPING_FILE"。使用 cat 将文件内容重定向到另一个命令通常是 anti-pattern.

第三个错误:gsed没有安装,或者它的名字不是gsed而是sed,或者它的目录不在你的PATH中。安装 gsed(或 sed)如果尚未安装,请设置您的 PATH 环境变量,并使用正确的命令名称:

$ export PATH=$PATH:/path/to/gsed-or-sed/directory
$ (g)sed --version

我还有一个 Linux 的 Windows 子系统,两者之间的 link 是使用 Linux 挂载点创建的,您可以从以下命令中看到:

WSL Prompt>/mnt/c/Temp_Folder/a$ df -k
Filesystem     1K-blocks      Used Available Use% Mounted on
...
C:\            999036924 491402636 507634288  50% /mnt/c

WSL Prompt>/mnt/c/Temp_Folder/a$ sudo mount -v
...
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)

因此,如果您想在您的计算机上工作,基于您的 WSL,您可能需要将 C:\ 替换为 /mnt/c/(并且不要忘记使用斜杠而不是反斜杠) .