【问题标题】:How to pass parameters to function when calling with "exec" in bash script在bash脚本中使用“exec”调用时如何将参数传递给函数
【发布时间】:2016-07-09 12:24:34
【问题描述】:

我正在编写一个脚本来创建一个清晰的视图并执行一些其他功能。

setview函数中,在脚本内部使用时,对视图进行操作,推荐的命令格式为

cleartool setview -exec "commands" view_name

对于“命令”部分,我想使用在此调用之前在同一 shell 脚本中定义的函数。当我执行以下操作时,它似乎不起作用:

cleartool setview -exec "function_name(var1, var2)" view_name

所以,我的问题是:函数可以与“exec”命令一起使用吗?如果可以,语法是什么?

在其中一个 SO 答案中,它提到不要使用 setview 而是使用 startview。由于我不知道两者之间的区别并且我需要在脚本中执行其他操作,如果我不应该使用 setview exec mecxhanism,我将不胜感激。

我尝试使用函数而不是从“exec”调用的另一个 shell 脚本的原因是,在使用函数时,我不必导出被调用脚本可以使用的变量,因为函数是在调用 setview 命令的同一脚本中定义。

【问题讨论】:

  • 您的意思是bash exec 命令,还是cleartool-exec 选项?
  • 在不了解 cleartool 如何实现 -exec 选项的情况下,您似乎不太可能以这种方式(或根本不可能)使用 shell 函数。由于 cleartool 是一个单独的实用程序而不是 shell 的一部分,因此它无法访问 shell 环境,只能通过创建新的子 shell 来实现 exec 选项;在该子外壳中,不会定义该函数。 (Bash 允许您将函数导出到 bash 子shell,但不能保证由 cleartool 启动的子shell 使用 bash。即使这样,您也需要导出所有内容,包括函数。)
  • @cdarke - 我的意思是-exec 选项到cleartool
  • @rici - 我能够为-exec 选项定义我需要的所有命令。正如我在之前的评论中提到的,我将探索如何使用@VonC 提到的 startview 命令。我可能需要发布其他问题,

标签: bash exec clearcase


【解决方案1】:

正如我所说的 repeatedly the past,永远不要使用 cleartool setview:这是不值得的,因为它 creates (fork) a sub-shell 在你的情况下,这使得传递参数变得非常困难。
(脚本中定义的那些变量将无法在分叉的子 shell 中访问)

setview 的唯一优势在于挂载视图的路径,它始终以/vobs/avob/... 开头

cleartool startview 确保 the dynamic view 已启动,可通过其完整路径 /view/aview/vobs/avob/...
在“How to run multiple Unix commands in one shot”查看更多信息

这样,您的脚本仍然非常简单(但必须使用视图的完整路径,而不是 /vobs/...):

cleartool startview aview
cd /view/aview(/vobs/avob/apth)

function_name(var1, var2)

假设我使用 startview 方法,在我的脚本中创建视图后如何找到视图路径?

动态视图的路径始终以相同的方式构建:

clearcase startview aViewX
cd /view/aViewX/
         ^^^^^^
cleartool lsview -l -pro aViewX -cview

最后一个命令将为您提供视图存储路径。 (见“To find a view storage directory”)

【讨论】:

  • 谢谢。我真正想做的是创建一个视图,将视图和视图存储文件复制到 NAS 共享(我一直无法在 NAS 共享上“创建视图”),然后 删除原始视图。那么,假设我使用 startview 方法,在脚本中创建视图后如何找到视图路径?另外,我想,在做 rmview 之前,我必须先做 stopview。这是正确的假设吗?
  • @adbdkb 这完全是另一个问题。我的回答是关于您关于如何在 bash 脚本中使用 startview 和函数的原始问题。随意提出另一个问题,提供更多详细信息(您的操作系统、您的 ClearCase 版本)
【解决方案2】:

@adbkdb 关于“我真正想做的事情......”如果您无法创建视图,那么确定您无法创建视图的原因比创建+复制+删除过程更有意义.使用 NAS 常驻视图存储创建视图有特定要求和特定流程。

如果这是一个 UCM 视图,并且“副本”指的是实际的 .vws 目录(与快照视图工作区相对),那么使用 rmview 删除视图会使副本实际上变得无用,因为流关联现在已被破坏.

【讨论】:

  • 我知道有特定的要求,但我无法对环境进行更改 - 不在我的控制范围内。我真正关心的是能够获取视图文件。我可以使用 setview 并为 setview 使用 exec "" 部分来做到这一点。因此,为了时间和资源的可用性以及改变事物的意愿,我将使用我最初的方法。但是 VonC 的回答/建议是在 exec "" 部分做太​​多事情的有效替代方法(我试图进行函数调用的原因),我将看看如何将它添加到我的脚本中。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多