Skip to content

Commit fada058

Browse files
committed
Allow more bash dialects
1 parent 9523365 commit fada058

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

server/src/util/__tests__/shebang.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ describe('analyzeShebang', () => {
2121

2222
test.each([
2323
['#!/bin/sh -', 'sh'],
24-
['#!/usr/bin/env bash', 'bash'],
2524
['#!/bin/sh', 'sh'],
25+
['#!/bin/env sh', 'sh'],
26+
['#!/usr/bin/env bash', 'bash'],
27+
['#!/bin/env bash', 'bash'],
2628
['#!/bin/bash', 'bash'],
2729
['#!/bin/bash -u', 'bash'],
2830
['#! /bin/bash', 'bash'],
31+
['#! /bin/dash', 'dash'],
2932
['#!/usr/bin/bash', 'bash'],
3033
])('returns a bash dialect for %p', (command, expectedDialect) => {
3134
expect(analyzeShebang(command).shellDialect).toBe(expectedDialect)

server/src/util/shebang.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
const SHEBANG_REGEXP = /^#!(.*)/
2+
const SHELL_REGEXP = /bin[/](?:env )?(\w+)/
23

3-
// TODO: at some point we could let this return all known shells (like dash, ksh, etc)
4-
// and make the call side decide what to support.
5-
type SupportedBashDialect = 'bash' | 'sh'
4+
const BASH_DIALECTS = ['sh', 'bash', 'dash', 'ksh'] as const
5+
type SupportedBashDialect = typeof BASH_DIALECTS[number]
66

77
export function getShebang(fileContent: string): string | null {
88
const match = SHEBANG_REGEXP.exec(fileContent)
@@ -14,16 +14,12 @@ export function getShebang(fileContent: string): string | null {
1414
}
1515

1616
export function getShellDialect(shebang: string): SupportedBashDialect | null {
17-
if (shebang.startsWith('/bin/sh') || shebang.startsWith('/usr/bin/env sh')) {
18-
return 'sh'
19-
}
20-
21-
if (
22-
shebang.startsWith('/bin/bash') ||
23-
shebang.startsWith('/usr/bin/bash') ||
24-
shebang.startsWith('/usr/bin/env bash')
25-
) {
26-
return 'bash'
17+
const match = SHELL_REGEXP.exec(shebang)
18+
if (match && match[1]) {
19+
const bashDialect = match[1].trim() as any
20+
if (BASH_DIALECTS.includes(bashDialect)) {
21+
return bashDialect
22+
}
2723
}
2824

2925
return null

0 commit comments

Comments
 (0)