Bash中“ if”条件中的“ cd”在“ if”之后不会更改当前目录

时间:2018-12-16 22:35:15

标签: bash if-statement sh cd error-code

我正在尝试在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();

1 个答案:

答案 0 :(得分:2)

bash中的括号创建了一个子shell,即fork()版的shell副本,带有其自己的环境变量,其自己的当前目录等;因此,在您的第一次尝试中,cd仅在闭合括号结束子shell之前才生效。 (POSIX并不严格要求这种subshel​​l行为,但是 要求括号中创建的环境具有其自己的工作目录,因此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