我正在创建一个名为domainname.com/search/query
的脚本来访问名为Big_script.sh
和A
的两个目录,在其中我需要访问名为B
的三个目录,{{1} },A1
; A2
,A3
,B1
(分别)。进入后,我需要脚本运行另一个带有B2
的脚本。
是否可以在B3
中执行以下操作:
sh small_script.sh
或者有没有办法在shell脚本或python中做到这一点可以帮助?因为它不起作用
答案 0 :(得分:1)
一次不能cd
到多个目录(如果cd
的路径是相对的,则需要返回原始目录)。它不是shell的限制,而是unix processes的属性(因此在Python或C等其他语言中编码不会发生太大变化);他们每个人都有
一个当前目录(并且shell为其cd
内置运行chdir(2)系统调用
您可以考虑计算每个目录的完整路径(使用realpath(1)),并将该路径存储在某个shell变量中。然后你可以循环cd
。
有些shell有一个堆栈目录,您可以使用pushd
& popd
。在这种情况下,您可以编码
for d in */* ; do
pushd "$d"
sh small_script
popd
done
您需要确保*/*
的{{3}}扩展仅提供目录。使用zsh
,您可以编码*/*(/)
以仅展开目录。见globbing& glob(7)& path_resolution(7)
如果您的shell没有pushd
,您可以尝试
for d in $(realpath */*); do
cd "$d" && sh small_script.sh
done
或使用子shell
for d in */*; do
(cd "$d" && exec small_script.sh)
done
有关pushd
&的更多信息,请参阅credentials(7) popd
请注意,如果稍后cd a/b
执行cd e/f
,则shell会尝试(对于第二个cd
)进入a/b/e/f
目录(可能不会因为e/f
是一个相对路径(因此在前一个当前目录a/b
的上下文中解释)。您可能需要cd a/b
后跟cd ../../e/f
...
花时间了解为什么cd
需要成为shell内置的。也许阅读this。
另见Advanced Linux Programming。它可能更有用(使用-exec
操作)。
small_script
更改为接受它应该去的目录的参数可能更简单。然后该脚本可能以cd "$1"
开头。