繁体   English   中英

为什么用“scriptName”调用脚本不起作用?

[英]Why calling a script by “scriptName” doesn't work?

我有一个简单的脚本cmakeclean来清理cmake临时文件:

#!/bin/bash -f

rm CMakeCache.txt
rm *.cmake

我称之为

$ cmakeclean

它确实删除了CMakeCache.txt,但它没有删除cmake_install.cmake

rm: *.cmake: No such file or directory

当我运行它时:

$ . cmakeclean

它确实删除了两者。

有什么区别, 我可以使这个脚本像通常的linux命令一样工作(没有.在前面)?

PS我确信两次都是相同的脚本执行。 为了检查这一点,我在脚本中添加了echo meme并以两种方式重新运行它。

删除-f从你的#!/bin/bash -f线。

-f阻止路径名扩展,这意味着*.cmake将不匹配任何内容。 当您将脚本作为脚本运行时,它会解释shebang行,并且实际上运行/bin/bash -f scriptname 当你运行它时. scriptname . scriptname ,shebang只是被视为注释行并被忽略,因此您在当前环境中没有设置-f的事实允许它按预期工作。

. script . scriptsource script缩写,这意味着当前 shell执行脚本中的命令。 如果那里有一个exit ,则当前 shell将退出(例如终端窗口将关闭)。

这通常用于修改当前shell的环境(设置变量等)。

script要求shell自行分叉,然后在子进程中exec给定的脚本,然后在父进程中等待终止子进程。 如果脚本中有一个exit ,这将由子shell执行,因此只能终止它。 父亲的外壳完好无损并且没有改变。

这通常用于从当前shell启动其他程序。

这是关于ClearCase的吗? 你在贫穷的生活中做了什么,你被分配到最深处的地狱工作?

多年来,我是一名资深的ClearCase管理员。 十多年来我没有碰过它。 我的生活现在好多了。 天空更蓝,鸟鸣更加悠扬,我每天上班的恐惧现在都少了。


回到你的问题:很难确切地说出发生了什么。 ClearCase做了一些古怪的事情。 在动态视图中,Unix系统上的ClearCase存储库隐藏在shell的环境中。 现在你看到了,现在你没有。

运行shell脚本时,它会启动一个新环境。 如果未导入特定的shell变量,则shell脚本不可见。 当您仅从命令行运行cmakeclean ,您将生成一个新shell - 一个不包含ClearCase环境的shell。

当您运行带有前缀的shell脚本时. cmakeclean . cmakeclean ,您在包含ClearCase环境的当前shell中运行该shell脚本。 因此,它可以看到您的ClearCase视图。

如果您正在使用快照视图,则可能有$HOME/.bashrc正在更改您的目录。 当一个新的shell环境在BASH(MacOS X和Linux中的默认shell)中运行时,它首先运行$HOME/.bashrc 如果这设置了特定目录,那么您最终会进入该目录,而不是在运行shell脚本的目录中。 当我也参与ClearCase地狱时,我会看到这个。 人们设置他们的.kshrc脚本(这是BASH和大多数人使用Kornshell之前的几天)来设置他们的视图。 不幸的是,这使得运行任何其他shell脚本几乎不可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM