对于 TTY,Command 与 `echo 命令 | bash`

For TTY, Command vs `echo command | bash`

成功了。

#!/usr/bin/env bash
set -x
docker exec -it pure-ftpd ftp localhost
printenv

失败,因为“输入设备不是 TTY”

#!/usr/bin/env bash
set -x
{
  echo "docker exec -it pure-ftpd ftp localhost"
} | {
  bash
  printenv
}

并且两个脚本的环境变量相同。有人能告诉我有什么区别吗?并且 SDKMAN 使用管道(第二种方式)来 运行 脚本,什么时候不应该使用管道?

Can someone tell me what is the difference?

区别在于docker exec的输入。

docker exec ... - input is your keyboard

和:

{
    echo docker exec ...  - your keyboard is ignored, echo does not read from stdin
} | {
     bash  - The input comes _only_ from echo, which is captured by bash.
}

因为您请求了交互式 TTY -ti 并且因为没有更多的输入(假设“您的键盘被忽略”),docker exec -ti 无事可做。