該賞金過期5天。此問題的答案有資格獲得 100聲望獎勵。 at想引起對這個問題的更多關注。
語境
作為使用 BATS 測驗的 Bash 腳本的一部分,我注意到當我運行一個激活 ssh 帳戶的函式時,我的測驗沒有終止。
代碼
以下函式假定 .ssh 中存在私有和公共 ssh 密鑰對/home/<username>/.ssh/。如果我使用手動運行它source src/the_bash_script.sh && activate_ssh_account <my_git_username>,它會作業并說Identity added: /home/name/.ssh/<my_git_email>:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/"$git_username"
}
但是,當它從測驗中運行時:
#!./test/libs/bats/bin/bats
load 'libs/bats-support/load'
load 'libs/bats-assert/load'
# https://github.com/bats-core/bats-file#Index-of-all-functions
load 'libs/bats-file/load'
# https://github.com/bats-core/bats-assert#usage
load 'assert_utils'
source src/the_bash_script.sh
@test "Check if ssh-account is activated after activating it." {
activate_ssh_account "some_git_username"
assert_equal "Something" "Something_else"
}
它無限期地掛起。
題
如何在不導致 BATS 測驗無限期掛起的情況下激活 ssh 帳戶?
uj5u.com熱心網友回復:
測驗無限期掛起,因為 BATS 等待ssh-agent終止(一旦行eval "$(ssh-agent -s)"被執行,它就會在后臺運行)。更具體地說,BATS 等待檔案描述符 3關閉(由 保持打開ssh-agent)。
因此,這可以通過實施檔案中提到的解決方法或通過殺死ssh-agent.
檔案中的解決方法:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s 3>&-)"
ssh-add ~/.ssh/"$git_username"
}
這將關閉 fd 3ssh-agent并且 BATS 將不再掛起。請注意ssh-agent,即使 BATS 退出,這也會在后臺運行。從您的問題中不清楚是否需要這樣做。如果不是,請使用下面的替代方法。
殺ssh-agent:
添加一個清理陷阱到activate_ssh_account:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
trap "trap - RETURN; kill \$SSH_AGENT_PID" RETURN
git_username=$1
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/"$git_username"
}
當函式退出并ssh-agent使用匯出的pid eval "$(ssh-agent -s)"(即變數SSH_AGENT_PID)殺死時執行陷阱。
如果您出于某種原因不想使用陷阱,這也可以:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s)"
result=0
ssh-add ~/.ssh/"$git_username" || result=$?
kill $SSH_AGENT_PID
return $result
}
請注意,該||構造是必要的,因為一旦命令失敗,BATS 將停止執行函式的代碼(即||,kill如果沒有,則不會在ssh-add失敗時執行)。
作為旁注,要實際測驗是activate_ssh_account成功還是失敗,您應該使用assert_success而不是assert_equal(除非您在問題中省略了更多代碼)。
uj5u.com熱心網友回復:
我從未使用過 BATS,但通過閱讀檔案,我可以說有一個特定的命令可以共享公共代碼。您可能需要指定完整路徑:
load: 共享通用代碼您可能希望跨多個測驗檔案共享公共代碼。Bats 包含一個方便的加載命令,用于獲取相對于當前測驗檔案位置的 Bash 源檔案。例如,如果您在 中有一個 Bats 測驗
test/foo.bats,則命令
load test_helper將在您的測驗檔案中獲取腳本 test/test_helper.bash 。這對于共享功能以設定環境或加載裝置很有用。
選項1:
嘗試更換
source src/the_bash_script.sh
和
load '/full/path/to/src/the_bash_script.sh'
選項 2:
嘗試添加采購 @test
@test "Check if ssh-account is activated after activating it." {
source /full/path/to/src/the_bash_script.sh
activate_ssh_account "some_git_username"
assert_equal "Something" "Something_else"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363581.html
