|
9 | 9 | #include "quote.h"
|
10 | 10 | #include "config.h"
|
11 | 11 |
|
| 12 | +const char *get_shell_path(const char *fallback) |
| 13 | +{ |
| 14 | + static const char *shell; |
| 15 | + static int initialized; |
| 16 | + |
| 17 | + if (!initialized) { |
| 18 | + if (!git_config_get_pathname("core.shell", &shell)) |
| 19 | + setenv("SHELL", shell, 1); |
| 20 | + initialized = 1; |
| 21 | + } |
| 22 | + |
| 23 | + return shell ? shell : fallback; |
| 24 | +} |
| 25 | + |
12 | 26 | void child_process_init(struct child_process *child)
|
13 | 27 | {
|
14 | 28 | memset(child, 0, sizeof(*child));
|
@@ -271,9 +285,9 @@ static const char **prepare_shell_cmd(struct strvec *out, const char **argv)
|
271 | 285 |
|
272 | 286 | if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) {
|
273 | 287 | #ifndef GIT_WINDOWS_NATIVE
|
274 |
| - strvec_push(out, SHELL_PATH); |
| 288 | + strvec_push(out, get_shell_path(SHELL_PATH)); |
275 | 289 | #else
|
276 |
| - strvec_push(out, "sh"); |
| 290 | + strvec_push(out, get_shell_path("sh")); |
277 | 291 | #endif
|
278 | 292 | strvec_push(out, "-c");
|
279 | 293 |
|
@@ -411,7 +425,7 @@ static int prepare_cmd(struct strvec *out, const struct child_process *cmd)
|
411 | 425 | * Add SHELL_PATH so in the event exec fails with ENOEXEC we can
|
412 | 426 | * attempt to interpret the command with 'sh'.
|
413 | 427 | */
|
414 |
| - strvec_push(out, SHELL_PATH); |
| 428 | + strvec_push(out, get_shell_path(SHELL_PATH)); |
415 | 429 |
|
416 | 430 | if (cmd->git_cmd) {
|
417 | 431 | prepare_git_cmd(out, cmd->argv);
|
|
0 commit comments