Shell 编程问题,怎么保证脚本的执行环境在没污染的环境下?

2017-04-19 11:06:14 +08:00
 sunjourney

在 shell 里给自己写的程序加了 alias wc=count ,但 count 的用法和 wc 不同 ,另外一个以前写的脚本用到了 wc, 现在执行会报错,它错误地使用了 count 。怎么使使这个以前的脚本一定用的是 wc 而不是我现在的 count 。其实我 tr 也被 alias 到了 tr=translate,也有使用的问题

这段脚本大概是这样:

res=$(echo $0 | grep '^pass' | wc -l | tr -d ' ')

感觉和上下文有关吧?怎么让以前这个程序处在没有加 alias 的环境下呢?

3026 次点击
所在节点    程序员
25 条回复
snip
2017-04-19 11:17:37 +08:00
使用原始路径,例如 /usr/bin/cp
expy
2017-04-19 11:19:35 +08:00
\wc \tr
vjnjc
2017-04-19 11:19:52 +08:00
占楼同问,比如我的脚本用了 alias wc=count 这污染了环境,正确的方法是不是在退出前用 unalias ?
Jisxu
2017-04-19 11:20:09 +08:00
unalias -a

> man:
unalias [-a] [name ...]
Remove each name from the list of defined aliases. If -a is supplied, all alias definitions are removed. The
return value is true unless a supplied name is not a defined alias.
xiaket
2017-04-19 11:25:34 +08:00
没人觉得你这样 alias 是有问题的咩? 如果觉得 count 和 translate 太长, 你应该 alias 到 c 和 t 或者, 让用途明显一点, mywc 和 mytr 嘛.
knightdf
2017-04-19 11:25:46 +08:00
env
sunjourney
2017-04-19 11:37:57 +08:00
@snip #1
@expy #2

类似的用法查过了。可以 \wc, 'wc', "wc", command wc ,但是其它的部分可以保证安全吗?有一天我 sb 了把 if , while 全 alias ,其它程序都崩了呢?

@knightdf #6 env 具体怎么做呢?
sunjourney
2017-04-19 11:42:00 +08:00
@xiaket #5 假如 c , t 被是原生的命令并且被其它的脚本用到了呢?感觉 shell 的程序与外部环境依赖太严重了,外部的状况很容易影响到 shell script 的执行结果。真有设计失败的感觉
xderam
2017-04-19 11:48:41 +08:00
别去改 root 的 alias ,自己用自己的 alias 就好了。这个不是设计失败,应该是使用习惯不好。 linux 设计的是多用户环境,环境之间本来就有”隔离“
sunjourney
2017-04-19 12:01:42 +08:00
@xderam #9 说说实际的情况吧,有一个程序,用到了 wc, tr ,有另一个程序,给 git 加别名。加别名的程序读入别名 $prefix , 执行 alias {$prefix}c='git commit', alias {$prefix}r='git remote', alias {$prefix}f='git fetch'
正常嘛,$prefix 传入的是 g ,此时 gc='git commit', gr='git remote',但现在想给 $prefix 传入 t,结果 tr 就变成了 git remote , 用到了 tr 的程序就废了。同理 $prefix 是 w, i ,这时 if, wc 都不能用了。我希望 alias 东西只影响用户自己的执行环境,用其它的脚本,它们内部用的 if ,wc, tr 还是上层环境的。全部写成 \wc \tr 是不实际的,\if 也不能这么用。
knightdf
2017-04-19 12:02:10 +08:00
@sunjourney man env
erobot
2017-04-19 12:09:48 +08:00
@sunjourney 测试了一下, alias 是不会影响到子 shell 的,难道你是 . script.sh 或者 source script.sh 来执行脚本的??
sunjourney
2017-04-19 12:22:49 +08:00
@erobot #12 程序写在 zsh 的 theme 里, zsh 的 theme 都是靠 source 执行,所以就这样了。
xiaket
2017-04-19 12:37:28 +08:00
@sunjourney 前面已经有人说了, 这不是设计失败, 是你的使用习惯问题. 另外, 我刚才列出 c 和 t 就是因为 a-z 都不是广为人知的系统命令.

另外, 不管是用 OSX/Windows/Linux, 用户自己要作死, 操作系统都是拦不住的.
sunjourney
2017-04-19 13:22:35 +08:00
@xiaket #14 那具体问题怎么解决, oh-my-zsh.sh source 的主题遇到了被 alias 掉的命令(比如 Soliah.zsh-theme , date , git ,一旦被 alias )使用都会出错,可有解决方法?
geelaw
2017-04-19 13:42:03 +08:00
答案是不要这么做就好了——不要 override 系统中默认的 aliases 和 names ,也不要在脚本里面创造 aliases 。

何必要创造问题呢?
sunjourney
2017-04-19 13:51:20 +08:00
@geelaw #16 嗯,只是想探讨问题而已,现在已经确定了此题无解,在程序里加了一个 warning 告知动态设定 alias 的方法对 source 到环境中的 function 与 rc scripts 有影响。
fxxkgw
2017-04-19 14:07:50 +08:00
LC_ALL=C
rrfeng
2017-04-19 14:43:42 +08:00
用已存在的名字当作 alias 是一种什么奇怪的想法呢……
momocraft
2017-04-19 14:50:30 +08:00
防御性编程: 在开头把需要的东西都 type 一遍,有 alias 就报错退出

当然人总是可以作死的,比如可能有人把 type 也 alias 掉。

不如一开始就不用容易搞出事的做法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355828

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX