ソースを参照

Shell: Recursively resolve aliases

AnotherTest 5 年 前
コミット
8d71eb9a6c
1 ファイル変更14 行追加3 行削除
  1. 14 3
      Shell/AST.cpp

+ 14 - 3
Shell/AST.cpp

@@ -745,7 +745,7 @@ RefPtr<Value> Execute::run(RefPtr<Shell> shell)
     auto initial_commands = m_command->run(shell)->resolve_as_commands(shell);
     decltype(initial_commands) commands;
 
-    for (auto& command : initial_commands) {
+    Function<void(Command&)> resolve_aliases_and_append = [&](auto& command) {
         if (!command.argv.is_empty()) {
             auto alias = shell->resolve_alias(command.argv[0]);
             if (!alias.is_null()) {
@@ -757,15 +757,26 @@ RefPtr<Value> Execute::run(RefPtr<Shell> shell)
                         subcommand_ast = ast->command();
                     }
                     RefPtr<Node> substitute = create<Join>(position(), move(subcommand_ast), create<CommandLiteral>(position(), command));
-                    commands.append(substitute->run(shell)->resolve_as_commands(shell));
+                    for (auto& subst_command : substitute->run(shell)->resolve_as_commands(shell)) {
+                        if (!subst_command.argv.is_empty() && subst_command.argv.first() == argv0) // Disallow an alias resolving to itself.
+                            commands.append(subst_command);
+                        else
+                            resolve_aliases_and_append(subst_command);
+                    }
                 } else {
                     commands.append(command);
                 }
             } else {
                 commands.append(command);
             }
+        } else {
+            commands.append(command);
         }
-    }
+    };
+
+    for (auto& command : initial_commands)
+        resolve_aliases_and_append(command);
+
     Vector<RefPtr<Job>> jobs_to_wait_for;
 
     auto run_commands = [&](auto& commands) {