我遇到了一个问题,即使到达“ exit 0”,我的bash脚本仍然执行命令。
#!/bin/bash
./command | while IFS= read -r l;
do
./command1 | while IFS= read -r m;
do
if openssl enc -aes-256-cbc -a -d -in junk.txt > junk1.txt -k "${m:9:41}";
then
exit 0
fi
done
done
答案 0 :(得分:0)
问题在于,管道中的shell命令(如两个 new Client {
ClientId = "hybridclient",
ClientName = "Example Hybrid Client",
ClientSecrets = new List<Secret> {
new Secret("idsrv3test".Sha256())
},
Enabled = true,
Flow = Flows.Hybrid,
RequireConsent = false,
RedirectUris = new List<string> {
hybridAppUrl,hybridApp1Url
},
PostLogoutRedirectUris = new List<string> {
hybridAppUrl,hybridApp1Url
},
LogoutUri= hybridAppUrl+"Account/SignoutCleanup",
AllowedScopes = new List<string> {
Constants.StandardScopes.OpenId,
Constants.StandardScopes.Profile,
Constants.StandardScopes.Email,
Constants.StandardScopes.Roles,
Constants.StandardScopes.OfflineAccess,
"sampleApi",
//"id"
},
AccessTokenType = AccessTokenType.Jwt,
RefreshTokenUsage=TokenUsage.ReUse,
RefreshTokenExpiration=TokenExpiration.Sliding
}
循环)在子shell中而不是在主shell中执行。这意味着其中一个循环中的 public ActionResult SignOut()
{
Request.GetOwinContext().Authentication.SignOut();
return this.Redirect("/");
}
[AllowAnonymous]
public void SignoutCleanup(string sid)
{
var cp = (ClaimsPrincipal)User;
var sidClaim = cp.FindFirst("sid");
if (sidClaim != null && sidClaim.Value == sid)
{
Request.GetOwinContext().Authentication.SignOut("Cookies");
}
}
退出子Shell,而不是父Shell。 (并且在子shell中定义/更改的变量不会影响父shell,并且...)
有两种方法可以使循环在主外壳中运行并避免此问题。一种是将输出发送到临时文件,然后从中读取:
while
...但是要正确执行此操作,则需要生成唯一的临时文件名(exit
是您的朋友),之后再删除它们,等等。
另一种可能性是使用bash的进程替换功能直接从其他命令重定向循环的输入:
./command >sometempfile
while IFS= read -r l; do
./command >anothertempfile
while IFS= read -r m; do
if openssl enc -aes-256-cbc -a -d -in junk.txt > junk1.txt -k "${m:9:41}"; then
exit 0
fi
done <anothertempfile
done <sometempfile
像这样使用流程替换与管道非常相似,不同之处在于您可以控制子流程中的内容和不包含的内容。另外,这是仅bash功能。当它以mktemp
或while IFS= read -r l; do
while IFS= read -r m; do
if openssl enc -aes-256-cbc -a -d -in junk.txt > junk1.txt -k "${m:9:41}"; then
exit 0
fi
done < <(./command)
done < <(./command)
以外的任何形式调用时,在其他shell中甚至在bash中都不可用。因此,请使用显式的bash shebang(sh
或bash
),并且不要通过使用#!/bin/bash
运行脚本来覆盖它。