【问题标题】:How to run multiple Unix commands in one shot如何一次性运行多个 Unix 命令
【发布时间】:2015-08-06 20:53:41
【问题描述】:

我试图一次执行多个命令,但令我惊讶的是,只有第一个命令被执行,其余的被跳过。命令是

cleartool setview view1234 ; cleartool setactivity activity456 ; cd /vobs/app/src/epw/WEB-INF/scripts ; pwd

而上述命令的输出是

You can now run 'clearquest' to start Rational ClearQuest.

但我希望看到以下 3 行输出:

You can now run 'clearquest' to start Rational ClearQuest.
Set activity "activity456" in view "view1234".
/vobs/app/src/epw/WEB-INF/scripts

通过将分号(;) 替换为和号(&) 或竖线(|),我的搜索努力为同一命令产生了更多变体,但似乎没有任何效果。

关于如何运行上述多个命令的任何建议/想法?

【问题讨论】:

  • 尝试使用&& 而不是单个。
  • Matt- && 的结果相同。我的意思是只有第一个命令被执行,之后什么都没有。甚至像 pwd 或 ls 这样的命令在视图创建后也不起作用。
  • 您是在 shell 提示符下运行该命令的,对吧?如果是这样,那应该依次执行所有三个命令,假设您有名为Cleartoolrun 的命令。你怎么知道第二个和第三个命令没有被执行?尝试一个简单的例子:`echo one ;回声二;回声三'
  • @MattClark:这不太可能有帮助。 && 的唯一区别是如果前一个命令失败,第二个和第三个命令不会运行。
  • @user1423854:如果一次运行一个命令会发生什么:运行Cleartool Setview viewname,然后运行Cleartool SetActivity activityname,然后运行run buildFile。再说一遍,你真的有一个叫做run的命令吗?

标签: unix ssh clearcase jsch cleartool


【解决方案1】:

不要在子shell中使用cleartool setview:it forks the current shell,这就是为什么在单行中执行时会跳过其余部分。
这就是为什么它在一个一个执行时起作用(最后两个在子shell中执行)

始终使用full path of the dynamic view/view/aview/vobs/avob/...,而不是setview(您不需要)。

如果您必须使用cleartool setview,则将其与-exec 选项一起使用(as in this answer):

cleartool setview -login -exec "command 1; command 2; command 3" view_tag

在你的情况下:

cleartool setview -exec 'cleartool setactivity activity456 ; cd /vobs/app/src/epw/WEB-INF/scripts ; pwd' view1234 

没有setview:

OP 询问:

假设我名为humanbeing 的视图在universe/planet/earth/humanbeing.vws

如何使用 startview command
是不是有点像

cleartool startview universe/planet/earth/humanbeing

cleartool startview cd universe/planet/earth/humanbeing

在这两种情况下,它都会显示错误:无法设置视图标签universe/planet/earth/humanbeing

当然,做一个cleartool lsview -s | grep humanbeing: 会给你视图标签。

应该是:

cleartool startview humanbeing
cd /view/humanbeing/vobs/<avob>

universe/planet/earth/humanbeing.vws 是视图存储,而不是视图标签。

确保

  • 已安装 (cleartool mount /vobs/avob)
  • myapp/WEB-INF/scripts 存在于 /view/humanbeing/vobs/&lt;avob&gt;

不要尝试在/vobs 中做任何符号链接:/vobs 是一个特殊的 MVFS(多版本文件系统)挂载点,而不是常规文件夹。
确保您的 web 应用搜索除 /vobs 之外的其他路径中的应用。

【讨论】:

  • 能否告诉我如何获取动态视图的完整路径?我为动态(集成)视图创建了一个别名,我正在尝试设置视图。
  • @user1423854 不设置视图。它只会带来问题(阅读stackoverflow.com/a/10252612/6309)。有关完整路径的示例,请参阅 stackoverflow.com/a/27826673/6309。这两个链接都在我的答案中。
  • 我能够在 view/myview/myVOBS 下找到 myapp/WEB-INF/scripts 文件夹,所以现在我的问题解决了。
【解决方案2】:

我无法使用 Clearcase 进行尝试,但有时根据过去的经验,您将需要 RTFM,此类工具可以接受反向管道或输入脚本文件,请查看文档中的语法,例如:

Cleartool &lt; echocommand_sequence

echo command_sequence | Cleartool -

Cleartool -f 输入文件命令序列

Cleartool -c 输入文件命令序列

Cleartool run 输入文件命令序列

如果您确实发现了上述问题的一些变体,请通过发布您自己的答案让我们知道,以便下一个遇到问题的人可以受益。

【讨论】:

  • 如果第一个 cleartool 命令是“setview”,这些都不会起作用:它分叉了 shell。
  • 如果您RTFM,您会看到不支持此类选项。
【解决方案3】:

我不确定您到底要做什么,因为它似乎是更大问题空间的一部分,但是...

cleartool setact -view view1234 activity456 

在视图中设置一个活动,然后

cd /view/view1234/vobs/app/src/epw/WEB-INF/scripts

会带你到那里。或者把它们拍在一起得到你的结果:

cleartool setact -view view1234 activity456 && cd /view/view1234/vobs/app/src/epw/WEB-INF/scripts && pwd

语句&lt;stmt1&gt; &amp;&amp; &lt;stmt2&gt;if [[ &lt;stmt1&gt; ]]; then &lt;stmt2&gt; 的简写

有关“一次性”执行 unix 命令的更多信息,请参阅KSH man page

分号 (;) 导致前面的管道顺序执行;与号 (&) 导致前面的管道异步执行(即,shell 不等待该管道完成)。符号 |& 导致前面的管道异步执行,其中建立了到父 shell 的双向管道; ...符号 && ( | | ) 导致它后面的列表仅在前面的管道返回零(非零)值时执行。

【讨论】:

  • 你的伪代码中的[[ 是错误的,有点。 sh(以及 ksh 和 Bash)语法就是 if stmt1; then stmt2; fi
  • 伪代码并不是按字面意思理解的。澄清。然而,最好将测试放在 [[ 中以避免结果模棱两可。搜索 [[ vs [ 解释
  • 许多初学者误解了if 的语法,并在错误假设[[(或[)是语法的一部分的情况下尝试这样做;暗示这是正确的误导他们恕我直言。参见例如以stackoverflow.com/questions/36371221/… 为例。
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多