上下文:我想迁移一个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:
(不要忘记用斜杠代替反斜杠)。