我在Termux上,在Termux上它不是/usr,它是/data/data/com.termux/files/usr。
这有时会导致运行脚本(主要是bash和make)时出现问题,而这些脚本的设计并不考虑Termux。
每次脚本想要从/usr开始在path上打开文件时,我都希望它被“重写”到有效的路径。
解决这一问题的任何其他解决办法也是受欢迎的。
发布于 2022-10-30 02:19:38
简单的答案是“使用sed将脚本中所有出现的/usr更改为/data/data/com.termux/files/usr”。例如:
sed -i -e 's=/usr=/data/data/com.termux/files/usr=g' *.sh问题是:如果部分或全部/usr路径已经更改为/data/data/.../usr,那么它们将再次被更改,最终成为/data/data/com.termux/files/data/data/com.termux/files/usr。例如:
$ echo /usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /data/data/com.termux/files/usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/data/data/com.termux/files/usr要解决这个问题,只有当/usr前面有空格或行的开头时,才允许更改它:
$ echo /data/data/com.termux/files/usr | sed -e 's=\(^\|[[:space:]]\)/usr=\1/data/data/com.termux/files/usr=g'或者用扩展的正则表达式稍微读一些:
$ echo /data/data/com.termux/files/usr | sed -E -e 's=(^|[[:space:]])/usr=\1/data/data/com.termux/files/usr='
/data/data/com.termux/files/usr下面这篇文章是在我想起....left之前写的,因为它是有用的信息,我不想删除它,我不想删除它:
或者,您也可以使用一个名为“消极展望”的regex功能。不幸的是,sed不支持向后看(*)。
Perl确实支持四舍五入,所以如果您已经在termux中安装了perl,那么您可以使用它(我上次使用Termux已经很长时间了,所以我不记得它是否包含了基本perl。这当然是一个可安装的包)。例如:
perl -i -p -e 's=(?(顺便说一句,perl的-p选项与sed类似,它是一个修改stdin或文件的工具。使用它的-n选项,perl的工作方式类似于sed -n。这是有意的-这种perl的使用意味着它是一种替代sed工具,用perl的全部功能来增强)。
或者,如果任何alpha-数值字符或/字符(S)紧跟在/usr之前,则负面展望可以避免更改D15:
perl -i -p -e 's=(?您可以在下面看到,只有当/usr本身发生变化时,它才会被更改:
$ echo /usr | perl -pe 's=(?(*)我知道的sed的唯一版本是Super或塞塞 (主页目前不起作用)。ssed似乎是被抛弃的--它已经很多年没有更新了--它是基于GNU 3.02从1998年开始的,而当前的GNU在2020年是4.8版。ssed是为Debian打包的,因此可能也适用于Termux。但是,如果要安装它,最好还是使用perl。
无论如何,ssed有一个-R选项,允许它使用与Perl兼容的正则表达式PCRE。
$ echo /data/data/com.termux/files/usr | ssed -R 's=(?https://unix.stackexchange.com/questions/722963
复制相似问题