我正在尝试在Bash脚本的“ if”条件下执行“ cd”。它在“ if”之后保留在同一目录中。因此,我必须在“ if”之外执行“ cd”,然后使用$?值如果。有办法避免使用此额外步骤吗?最快的方法是什么?
查看我的代码的三种变体:
const { Builder, By, Key, until } = require('selenium-webdriver');
async function main() {
let driver = new Builder().forBrowser('chrome').build();
driver.get('https://supremenewyork.com');
driver.findElement(By.className('shop_link')).click();
let element =
await driver.wait(until.elementLocated(By.xpath("//*[contains(@href,'http://www.supremenewyork.com/shop/all')]", 10000)));
await element.click();
}
main();
答案 0 :(得分:2)
bash中的括号创建了一个子shell,即fork()
版的shell副本,带有其自己的环境变量,其自己的当前目录等;因此,在您的第一次尝试中,cd
仅在闭合括号结束子shell之前才生效。 (POSIX并不严格要求这种subshell行为,但是 要求括号中创建的环境具有其自己的工作目录,因此cd
的作用将取决于所有符合标准的Shell,无论该Shell是否在所有情况下实际上都使用fork()
。
当您不想创建子外壳时,请使用大括号而不是括号进行分组。那就是:
if ! { rm -rf sim && mkdir sim && cd sim; }; then
echo "$0: Cannot prepare simulation directory"
exit 1
fi
也就是说,您的第二种方法效果很好(尽管编写起来很笨拙,而不是传统的习惯用语)。
bash <<'EOF'
cd /tmp
echo "Starting in $PWD"
if ! rm -rf sim || ! mkdir sim || ! cd sim; then
echo "$0: Cannot prepare simulation directory"
exit 1
fi
echo "Ending in $PWD"
EOF
...正确发射:
Starting in /tmp
Ending in /tmp/sim