

















@@ -531,12 +531,6 @@ function runCommandArgs(commandArgs) {
531531532532function normalizedCommandWords(commandArgs) {
533533const words = commandArgs.length === 1 ? commandArgs[0].split(/\s+/u) : [...commandArgs];
534-while (words[0] === "env") {
535-words.shift();
536-while (/^[A-Za-z_][A-Za-z0-9_]*=/.test(words[0] ?? "")) {
537-words.shift();
538-}
539-}
540534while (/^[A-Za-z_][A-Za-z0-9_]*=/.test(words[0] ?? "")) {
541535words.shift();
542536}
@@ -708,6 +702,12 @@ function stripShellExecutionPrefixes(words) {
708702}
709703continue;
710704}
705+if (first === "env") {
706+if (!stripEnvCommandOptions(words, { canShimIgnoreEnvironment: false })) {
707+return words;
708+}
709+continue;
710+}
711711if (first === "time") {
712712words.shift();
713713stripTimeOptions(words);
@@ -721,6 +721,91 @@ function stripShellExecutionPrefixes(words) {
721721}
722722}
723723724+function stripEnvCommandOptions(words, { canShimIgnoreEnvironment = true } = {}) {
725+const originalWords = [...words];
726+const envCommand = words.shift() ?? "";
727+let ignoresEnvironment = false;
728+for (;;) {
729+const word = words[0] ?? "";
730+if (!word) {
731+words.splice(0, words.length, ...originalWords);
732+return false;
733+}
734+if (word === "--") {
735+words.shift();
736+return true;
737+}
738+if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(word)) {
739+words.shift();
740+continue;
741+}
742+if (word === "-S" || word === "--split-string") {
743+if (ignoresEnvironment) {
744+words.splice(0, words.length, ...originalWords);
745+return false;
746+}
747+words.shift();
748+const split = splitShellWords(words.shift() ?? "");
749+words.unshift(...split);
750+return words.length > 0;
751+}
752+if (word.startsWith("-S") && word !== "-S") {
753+if (ignoresEnvironment) {
754+words.splice(0, words.length, ...originalWords);
755+return false;
756+}
757+words.shift();
758+words.unshift(...splitShellWords(word.slice(2)));
759+return words.length > 0;
760+}
761+if (word.startsWith("--split-string=")) {
762+if (ignoresEnvironment) {
763+words.splice(0, words.length, ...originalWords);
764+return false;
765+}
766+words.shift();
767+words.unshift(...splitShellWords(word.slice("--split-string=".length)));
768+return words.length > 0;
769+}
770+if (word === "-i" || word === "--ignore-environment") {
771+if (!canShimIgnoreEnvironment || envCommand.includes("/")) {
772+words.splice(0, words.length, ...originalWords);
773+return false;
774+}
775+ignoresEnvironment = true;
776+words.shift();
777+continue;
778+}
779+if (word === "-u" || word === "--unset" || word === "-C" || word === "--chdir") {
780+words.shift();
781+if (words[0]) {
782+words.shift();
783+}
784+continue;
785+}
786+if (word.startsWith("--unset=") || word.startsWith("--chdir=")) {
787+words.shift();
788+continue;
789+}
790+if (word.startsWith("-") && word !== "-") {
791+if (word.includes("i")) {
792+if (!canShimIgnoreEnvironment || envCommand.includes("/")) {
793+words.splice(0, words.length, ...originalWords);
794+return false;
795+}
796+ignoresEnvironment = true;
797+}
798+words.shift();
799+continue;
800+}
801+if (ignoresEnvironment && (!canShimIgnoreEnvironment || envCommand.includes("/"))) {
802+words.splice(0, words.length, ...originalWords);
803+return false;
804+}
805+return true;
806+}
807+}
808+724809function shellWordBasename(word) {
725810return (word ?? "").split("/").pop() ?? "";
726811}
@@ -1249,7 +1334,27 @@ function remoteAwsMacosJsBootstrap({ packageManager = false } = {}) {
12491334'tar -xzf "$tmp_dir/$pkg" -C "$tool_root" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
12501335'rm -rf "$tmp_dir";',
12511336"fi;",
1252-"node --version >&2;",
1337+"node --version >&2 || return 1;",
1338+"openclaw_crabbox_env() {",
1339+"openclaw_env_args=();",
1340+"openclaw_env_ignore=0;",
1341+"openclaw_env_path_seen=0;",
1342+'while [ "$#" -gt 0 ]; do',
1343+'case "$1" in',
1344+'-i|--ignore-environment) openclaw_env_ignore=1; openclaw_env_args+=("$1"); shift ;;',
1345+'-S|--split-string|-S*|--split-string=*) command env "${openclaw_env_args[@]}" "$@"; return ;;',
1346+'-[!-]*i*) openclaw_env_ignore=1; openclaw_env_args+=("$1"); shift ;;',
1347+'-u|--unset|-C|--chdir) openclaw_env_args+=("$1"); shift; if [ "$#" -gt 0 ]; then openclaw_env_args+=("$1"); shift; fi ;;',
1348+'--unset=*|--chdir=*) openclaw_env_args+=("$1"); shift ;;',
1349+'PATH=*) if [ "$openclaw_env_ignore" = "1" ]; then openclaw_env_args+=("PATH=$PATH:${1#PATH=}"); else openclaw_env_args+=("$1"); fi; openclaw_env_path_seen=1; shift ;;',
1350+'[A-Za-z_]*=*) openclaw_env_args+=("$1"); shift ;;',
1351+'--) openclaw_env_args+=("--"); shift; break ;;',
1352+"*) break ;;",
1353+"esac;",
1354+"done;",
1355+'if [ "$openclaw_env_ignore" = "1" ] && [ "$openclaw_env_path_seen" = "0" ]; then openclaw_env_args+=("PATH=$PATH"); fi;',
1356+'command env "${openclaw_env_args[@]}" "$@";',
1357+"};",
12531358];
12541359if (packageManager) {
12551360bootstrap.push(
@@ -1265,9 +1370,34 @@ function remoteAwsMacosJsBootstrap({ packageManager = false } = {}) {
12651370return bootstrap.join(" ");
12661371}
126713721373+function scopedAwsMacosEnvCommand(commandArgs) {
1374+if (commandArgs.length <= 1 || shellWordBasename(commandArgs[0]) !== "env" || commandArgs[0].includes("/")) {
1375+return null;
1376+}
1377+1378+const targetWords = [...commandArgs];
1379+if (!stripEnvCommandOptions(targetWords, { canShimIgnoreEnvironment: true })) {
1380+return null;
1381+}
1382+1383+const targetEntrypoint = shellWordBasename(targetWords[0]);
1384+if (!jsRuntimeEntrypoints.has(targetEntrypoint) && !awsMacosCorepackEntrypoints.has(targetEntrypoint)) {
1385+return null;
1386+}
1387+1388+return {
1389+runtimeEntrypoint: targetEntrypoint,
1390+packageManager: awsMacosCorepackEntrypoints.has(targetEntrypoint),
1391+shellCommand: `openclaw_crabbox_env ${shellJoin(commandArgs.slice(1))}`,
1392+};
1393+}
1394+12681395function injectRemoteAwsMacosJsBootstrap(commandArgs, providerName) {
12691396const runArgs = runCommandArgs(commandArgs);
1270-const runtimeEntrypoint = commandRuntimeEntrypoint(runArgs);
1397+const directScopedEnvCommand = hasOption(commandArgs, "--shell")
1398+ ? null
1399+ : scopedAwsMacosEnvCommand(runArgs);
1400+const runtimeEntrypoint = directScopedEnvCommand?.runtimeEntrypoint || commandRuntimeEntrypoint(runArgs);
12711401if (!isAwsMacosRemoteTarget(commandArgs, providerName) || !runtimeEntrypoint) {
12721402return commandArgs;
12731403}
@@ -1280,11 +1410,12 @@ function injectRemoteAwsMacosJsBootstrap(commandArgs, providerName) {
12801410const normalizedArgs = [...commandArgs];
12811411const remoteCommand = normalizedArgs.slice(start);
12821412const originalShellCommand =
1283-hasOption(normalizedArgs, "--shell") && remoteCommand.length === 1
1413+directScopedEnvCommand?.shellCommand ??
1414+(hasOption(normalizedArgs, "--shell") && remoteCommand.length === 1
12841415 ? remoteCommand[0]
1285- : shellJoin(remoteCommand);
1416+ : shellJoin(remoteCommand));
12861417const shellCommand = `${remoteAwsMacosJsBootstrap({
1287- packageManager: commandNeedsAwsMacosPackageManager(runArgs),
1418+ packageManager: directScopedEnvCommand?.packageManager || commandNeedsAwsMacosPackageManager(runArgs),
12881419 })} && { ${originalShellCommand}\n}`;
1289142012901421if (!hasOption(normalizedArgs, "--shell")) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。