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



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

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

MAPPING_FILE=C:UsersnameDesktopandroidx-class-mapping.csv
PROJECT_DIR=C:ProyectosProyecto 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中的字符串使用,但我不能使它工作,我将感谢一些帮助!

第一个错误:将参数展开双引号以避免在空格处分字:


find "$PROJECT_DIR" ...

第二个错误:I am surprised that you got this error。它应该是:

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

,因为MAPPING_FILE赋值中的反斜杠应该被丢弃。使用单引号保留反斜杠:

MAPPING_FILE='C:UsersnameDesktopandroidx-class-mapping.csv'

同样适用于PROJECT_DIR赋值;单引号:

PROJECT_DIR='C:ProyectosProyecto STH trunk'

done < "$MAPPING_FILE"代替done <<< "$(cat $MAPPING_FILE)"。使用cat将文件内容重定向到另一个命令通常是反模式的。

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

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

我也有一个Linux的Windows子系统,两者之间的链接是使用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,你可能需要用/mnt/c/代替C:(不要忘记用斜杠代替反斜杠)。

相关内容

  • 没有找到相关文章

最新更新