GitHub Actions工作流报错exit code 127:命令未找到求助
问题分析
exit code 127错误表示bash无法识别脚本中的某个命令,你的核心问题是工作流脚本中使用了HTML实体的引号("),而非bash支持的普通双引号("),导致bash将这些实体字符当作命令的一部分解析,最终触发"命令未找到"的错误。
修复步骤
- 替换所有HTML引号实体:将脚本中所有的
"替换为普通双引号",这是解决exit code 127的关键。 - 优化变量拼接逻辑:调整MESSAGE变量的换行拼接方式,避免出现多余空行和语法问题。
- 适配Telegram格式要求:添加Markdown特殊字符转义,使用Telegram推荐的
MarkdownV2格式,防止消息因特殊字符发送失败。
修复后的完整工作流配置
name: Telegram Message on: push: pull_request: issues: release: create: delete: fork: watch: deployment: deployment_status: milestone: repository_dispatch: jobs: notify: runs-on: ubuntu-latest steps: - name: Send Message to Telegram run: | EVENT_NAME=${{ github.event_name }} REPO_NAME=${{ github.repository }} REPO_URL="https://github.com/${{ github.repository }}" BRANCH_NAME=${{ github.ref_name }} COMMIT_MESSAGE=${{ github.event.head_commit.message || 'N/A' }} COMMIT_AUTHOR=${{ github.event.head_commit.author.name || 'N/A' }} PR_TITLE=${{ github.event.pull_request.title || 'N/A' }} ISSUE_TITLE=${{ github.event.issue.title || 'N/A' }} RELEASE_NAME=${{ github.event.release.name || 'N/A' }} RELEASE_BODY=${{ github.event.release.body || 'N/A' }} FORK_NAME=${{ github.event.forkee.full_name || 'N/A' }} WATCHER=${{ github.actor || 'N/A' }} DEPLOYMENT_URL=${{ github.event.deployment.url || 'N/A' }} DEPLOYMENT_STATUS=${{ github.event.deployment_status.state || 'N/A' }} MILESTONE_TITLE=${{ github.event.milestone.title || 'N/A' }} DISPATCH_EVENT_TYPE=${{ github.event.action || 'N/A' }} MESSAGE="**Event Type:** $EVENT_NAME **Repository:** $REPO_NAME **Repository URL:** $REPO_URL **Branch:** $BRANCH_NAME" if [ "$EVENT_NAME" == "push" ]; then MESSAGE+=" **Commit Message:** $COMMIT_MESSAGE **Commit Author:** $COMMIT_AUTHOR" fi if [ "$EVENT_NAME" == "pull_request" ]; then MESSAGE+=" **Pull Request Title:** $PR_TITLE" fi if [ "$EVENT_NAME" == "issues" ]; then MESSAGE+=" **Issue Title:** $ISSUE_TITLE" fi if [ "$EVENT_NAME" == "release" ]; then MESSAGE+=" **Release Name:** $RELEASE_NAME **Release Body:** $RELEASE_BODY" fi if [ "$EVENT_NAME" == "fork" ]; then MESSAGE+=" **Forked Repository:** $FORK_NAME" fi if [ "$EVENT_NAME" == "watch" ]; then MESSAGE+=" **Watcher:** $WATCHER" fi if [ "$EVENT_NAME" == "deployment" ]; then MESSAGE+=" **Deployment URL:** $DEPLOYMENT_URL" fi if [ "$EVENT_NAME" == "deployment_status" ]; then MESSAGE+=" **Deployment Status:** $DEPLOYMENT_STATUS" fi if [ "$EVENT_NAME" == "milestone" ]; then MESSAGE+=" **Milestone Title:** $MILESTONE_TITLE" fi if [ "$EVENT_NAME" == "repository_dispatch" ]; then MESSAGE+=" **Dispatch Event Type:** $DISPATCH_EVENT_TYPE" fi # 转义Telegram MarkdownV2要求的特殊字符 ESCAPED_MESSAGE=$(echo "$MESSAGE" | sed -e 's/\_/\\_/g' -e 's/\*/\\*/g' -e 's/\[/\\[/g' -e 's/\]/\\]/g' -e 's/\(/\\(/g' -e 's/\)/\\)/g' -e 's/\~/\\~/g' -e 's/\`/\\`/g' -e 's/\!/\\!/g') curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_TOKEN }}/sendMessage" \ -d chat_id=${{ secrets.CHAT_ID }} \ -d text="$ESCAPED_MESSAGE" \ -d parse_mode=MarkdownV2 env: TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.CHAT_ID }}
额外说明
- 保留了你原有的所有事件触发逻辑和变量获取规则,仅修正语法问题和格式适配。
- 添加的特殊字符转义逻辑,避免消息中包含下划线、星号等字符导致Telegram API拒绝请求。
- 使用
MarkdownV2格式替代原有的Markdown,这是Telegram当前推荐的Markdown格式标准。
内容的提问来源于stack exchange,提问作者Nariman Jahanshahi
相关产品推荐
相关产品推荐

