You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中能否通过变量动态指定使用的Shell?

GitHub Actions动态指定Shell的实现方法

问题背景

尝试在GitHub Actions中通过环境变量指定要使用的Shell,以此减少代码冗余。已确认变量已正确设置,但在shell字段中使用变量时无法生效,官方文档未找到相关说明,需实现Shell的动态指定。

相关工作流代码:

jobs:
  regular:
    strategy:
      matrix:
        os: [ macos, ubuntu, windows]
      fail-fast: false # Allows to see results from other combinations
    runs-on: ${{ matrix.os }}-latest
    steps:
      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
    ......
      - name: Set OS-specific variables for Windows
        if: matrix.os == 'windows'
        run: |
          echo "OS_PATH=windows" >> $GITHUB_ENV
          echo "OS_FILE_EXTENSION=ps" >> $GITHUB_ENV
          echo "OS_SHELL=pwsh" >> $GITHUB_ENV
        shell: bash

      - name: Set OS-specific variables for macOS and Ubuntu
        if: matrix.os != 'windows'
        run: |
          echo "OS_PATH=linux_mac" >> $GITHUB_ENV
          echo "OS_FILE_EXTENSION=sh" >> $GITHUB_ENV
          echo "OS_SHELL=bash" >> $GITHUB_ENV
        shell: bash

      - name: print out vars
        id: printOutVars
        shell: bash
        run: env
      - name: test echo
        run: |
          echo ${{ env.OS_PATH }}
          echo ${{ env.OS_SHELL }}
          echo ${{ env.OS_FILE_EXTENSION }}
        shell: bash
      - name: Download Issues with end limit
        id: normalIssuesWithEndLimit
        run: ./${{ env.OS_PATH }}/magpi-issue-downloader.${{ env.OS_FILE_EXTENSION }} -l 2
        shell: ${{ env.OS_SHELL }}

原因分析

GitHub Actions的shell字段是在工作流解析阶段确定的,而环境变量是在运行阶段设置的,因此无法用运行时的环境变量来动态指定shell字段的值。

可行解决方案

方案一:扩展矩阵配置直接定义Shell

将OS对应的Shell、路径、文件扩展名直接纳入矩阵配置,避免使用环境变量中转,直接在步骤中引用矩阵变量:

jobs:
  regular:
    strategy:
      matrix:
        include:
          - os: macos
            os_path: linux_mac
            file_ext: sh
            shell: bash
          - os: ubuntu
            os_path: linux_mac
            file_ext: sh
            shell: bash
          - os: windows
            os_path: windows
            file_ext: ps
            shell: pwsh
      fail-fast: false
    runs-on: ${{ matrix.os }}-latest
    steps:
      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
      # 省略其他步骤
      - name: Download Issues with end limit
        id: normalIssuesWithEndLimit
        run: ./${{ matrix.os_path }}/magpi-issue-downloader.${{ matrix.file_ext }} -l 2
        shell: ${{ matrix.shell }}

方案二:使用条件分支步骤

为不同操作系统分别定义独立的步骤,通过if条件判断执行对应逻辑:

jobs:
  regular:
    strategy:
      matrix:
        os: [macos, ubuntu, windows]
      fail-fast: false
    runs-on: ${{ matrix.os }}-latest
    steps:
      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
      # 省略其他步骤
      - name: Download Issues (macOS/Ubuntu)
        if: matrix.os != 'windows'
        run: ./linux_mac/magpi-issue-downloader.sh -l 2
        shell: bash
      - name: Download Issues (Windows)
        if: matrix.os == 'windows'
        run: ./windows/magpi-issue-downloader.ps1 -l 2
        shell: pwsh

方案三:依赖脚本自身的Shebang(无需指定Shell)

确保脚本包含正确的Shebang声明(比如.sh文件开头添加#!/bin/bash),Windows PowerShell脚本无需额外设置。然后直接运行脚本,GitHub Actions会自动识别并使用对应Shell:

jobs:
  regular:
    strategy:
      matrix:
        os: [ macos, ubuntu, windows]
      fail-fast: false
    runs-on: ${{ matrix.os }}-latest
    steps:
      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
      # 省略其他步骤
      - name: Set OS-specific variables
        run: |
          if [ "$RUNNER_OS" == "Windows" ]; then
            echo "OS_PATH=windows" >> $GITHUB_ENV
            echo "OS_FILE_EXTENSION=ps1" >> $GITHUB_ENV
          else
            echo "OS_PATH=linux_mac" >> $GITHUB_ENV
            echo "OS_FILE_EXTENSION=sh" >> $GITHUB_ENV
          fi
        shell: bash
      - name: Make script executable (non-Windows)
        if: matrix.os != 'windows'
        run: chmod +x ./${{ env.OS_PATH }}/magpi-issue-downloader.${{ env.OS_FILE_EXTENSION }}
        shell: bash
      - name: Set PowerShell execution policy (Windows)
        if: matrix.os == 'windows'
        run: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
        shell: pwsh
      - name: Download Issues with end limit
        id: normalIssuesWithEndLimit
        run: ./${{ env.OS_PATH }}/magpi-issue-downloader.${{ env.OS_FILE_EXTENSION }} -l 2

内容的提问来源于stack exchange,提问作者Joergi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:37:03