





















@@ -100,8 +100,37 @@ function optionName(token: string): string {
100100return token.split("=", 1)[0] ?? token;
101101}
102102103-function hasInlineShortOptionValue(token: string): boolean {
104-return /^-[A-Za-z].+/u.test(token) && token.length > 2;
103+type ParsedCarrierOption = {
104+name: string;
105+hasInlineValue: boolean;
106+};
107+108+function parseCarrierOptionToken(
109+token: string,
110+optionsWithValue: ReadonlySet<string>,
111+): ParsedCarrierOption {
112+if (token.startsWith("--")) {
113+return { name: optionName(token), hasInlineValue: token.includes("=") };
114+}
115+const shortName = token.slice(0, 2);
116+if (/^-[A-Za-z]/u.test(shortName) && token.length > 2 && optionsWithValue.has(shortName)) {
117+return { name: shortName, hasInlineValue: true };
118+}
119+return { name: token, hasInlineValue: false };
120+}
121+122+function knownCarrierOptionConsumesNextValue(
123+option: ParsedCarrierOption,
124+standaloneOptions: ReadonlySet<string>,
125+optionsWithValue: ReadonlySet<string>,
126+): boolean | null {
127+if (standaloneOptions.has(option.name)) {
128+return false;
129+}
130+if (optionsWithValue.has(option.name)) {
131+return !option.hasInlineValue;
132+}
133+return null;
105134}
106135107136function resolveEnvSplitPayload(payload: string, depth: number): string[] | null {
@@ -138,17 +167,18 @@ function resolveEnvCarriedArgv(argv: string[], depth = 0): string[] | null {
138167return resolveEnvSplitPayload(token.slice(2), depth);
139168}
140169if (token.startsWith("-")) {
141-const normalized = optionName(token);
142-if (ENV_STANDALONE_OPTIONS.has(normalized)) {
143-continue;
170+const consumeNextValue = knownCarrierOptionConsumesNextValue(
171+parseCarrierOptionToken(token, ENV_OPTIONS_WITH_VALUE),
172+ENV_STANDALONE_OPTIONS,
173+ENV_OPTIONS_WITH_VALUE,
174+);
175+if (consumeNextValue === null) {
176+return null;
144177}
145-if (ENV_OPTIONS_WITH_VALUE.has(normalized)) {
146-if (!token.includes("=") && !hasInlineShortOptionValue(token)) {
147-index += 1;
148-}
149-continue;
178+if (consumeNextValue) {
179+index += 1;
150180}
151-return null;
181+continue;
152182}
153183return argv.slice(index);
154184}
@@ -204,20 +234,22 @@ function resolveSudoLikeCarriedArgv(argv: string[]): string[] | null {
204234if (!token.startsWith("-")) {
205235return argv.slice(index);
206236}
207-const normalized = optionName(token);
208-if (executable === "sudo" && SUDO_NON_EXEC_OPTIONS.has(normalized)) {
237+const option = parseCarrierOptionToken(token, optionsWithValue);
238+if (executable === "sudo" && SUDO_NON_EXEC_OPTIONS.has(option.name)) {
209239return null;
210240}
211-if (standaloneOptions.has(normalized)) {
212-continue;
241+const consumeNextValue = knownCarrierOptionConsumesNextValue(
242+option,
243+standaloneOptions,
244+optionsWithValue,
245+);
246+if (consumeNextValue === null) {
247+return null;
213248}
214-if (optionsWithValue.has(normalized)) {
215-if (!token.includes("=") && !hasInlineShortOptionValue(token)) {
216-index += 1;
217-}
218-continue;
249+if (consumeNextValue) {
250+index += 1;
219251}
220-return null;
252+continue;
221253}
222254return null;
223255}
@@ -259,17 +291,18 @@ function resolveExecCarriedArgv(argv: string[]): string[] | null {
259291if (!token.startsWith("-")) {
260292return argv.slice(index);
261293}
262-const normalized = optionName(token);
263-if (EXEC_STANDALONE_OPTIONS.has(normalized)) {
264-continue;
294+const consumeNextValue = knownCarrierOptionConsumesNextValue(
295+parseCarrierOptionToken(token, EXEC_OPTIONS_WITH_VALUE),
296+EXEC_STANDALONE_OPTIONS,
297+EXEC_OPTIONS_WITH_VALUE,
298+);
299+if (consumeNextValue === null) {
300+return null;
265301}
266-if (EXEC_OPTIONS_WITH_VALUE.has(normalized)) {
267-if (!token.includes("=") && !hasInlineShortOptionValue(token)) {
268-index += 1;
269-}
270-continue;
302+if (consumeNextValue) {
303+index += 1;
271304}
272-return null;
305+continue;
273306}
274307return null;
275308}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。