环境:带有 bash 终端的 Linux RedHat 5
我需要自动化一个流程来做两件事:
- 让用户安装提示用户输入的 DVD(带有脚本),
并在硬盘上创建一些目录。
- 让第二个脚本 scp 一些文件到硬盘驱动器目录,并且
然后自动刻录数据 DVD。
现在我需要用户手动 cd 到步骤 2 并运行 .sh2。
一般程序:
- 用户输入提供的光盘,安装 dvd 驱动器,并提示
一个名字”。读取变量“名称”、目录和子目录
目录在/tmp/"name"下创建。
- 用户必须手动导航到/tmp/name 目录和 ./2.sh,才能启动
关闭第二个脚本。
我在使用导出名称完全自动化和启动第二个 .sh 时遇到两个问题。问题是第二个 .sh 需要弹出安装的 dvd 驱动器(运行 .sh1 的驱动器),并且在后台运行 .sh2 完全跳过我在 .sh2 上执行的 scp 数据拉取。
关于如何导出 .sh1 变量、用脚本弹出 dvd,然后运行 .sh2 脚本(它可以获取 .sh1(不再运行)脚本变量名)有什么想法吗?
我考虑过写一个变量名的文件到硬盘目录来解决导出变量的问题(导出名不起作用),但我仍然没有想到如何让.2sh自动运行/tmp/name 目录(.sh2 不允许 scps/dvd 刻录完成),执行 scp,并允许我的“刻录 dvd”.sh 运行。
您没有提供足够的细节来计算出答案的所有细节。然而:
1) 如果要卸载 DVD,调用第一个脚本的进程和第一个脚本本身(或任何其他进程)都不能将其作为当前目录。这意味着,您不能将第一个脚本调用为 cd/media/dvd; bash ./1.sh
,但是你必须做类似 bash/media/dvd/1.sh
2) 在第一个脚本中创建/tmp/name
后,cd
到它,创建第二个脚本,使其可执行(不要忘记适当的shebang),并将其作为 exec ./2.sh
调用。使用 exec
至关重要。如果不这样做,第一个脚本的文件将保持打开状态,并且 DVD 挂载点将保持忙碌。如果您使用 exec
,shell 知道不会再从该文件中读取任何行,将其关闭并释放 DVD 挂载点。
3) 将变量传递给脚本的最简单方法是将其作为命令行参数传递。因此,您应该使用类似 exec ./2.sh "$name"
的内容调用第二个脚本,并在第二个脚本的文本中将该参数称为 "$1"
.但是,如果我理解正确的话,你想要传递的是你从中创建 /tmp/name
目录的同一个变量,即 ./2.sh< 的当前目录
。如果是这种情况,则可以通过 2.sh
中的 name="$(basename $(pwd))
检索它的值。
4) export name
对你不起作用,因为 export
使当前进程的子进程知道一个变量,但第二个脚本不是首先在你的场景中。 export name
如果您按照我在上一点中概述的方式进行操作,将会起作用,因为当您exec ./2.sh
时,环境保持不变,但它仍然是如果您显式传递该值,可读性会更高。
5) 一般来说,当您计划根据用户输入执行操作时,在执行任何操作之前对其进行清理是非常重要的:检查任何用户提供的字符串对于空白,奇怪的字符,例如空格,换行符,斜杠,分号等...还要检查在文件系统上操作时可能无害的字符,但可能会在新刻录的 DVD 上引起问题,检查哪些字符在每个字符上都是合法的您程序的步骤...简而言之,不要相信用户输入。