Shell: Add redirections to the formatted command string

This commit is contained in:
AnotherTest 2020-10-28 17:20:42 +03:30 committed by Andreas Kling
parent a46318d414
commit 384e872ff9
Notes: sideshowbarker 2024-07-19 01:39:52 +09:00
2 changed files with 45 additions and 7 deletions

View File

@ -50,12 +50,50 @@ void AK::Formatter<Shell::AST::Command>::format(TypeErasedFormatParams&, FormatB
if (m_width != value_not_set && m_precision != value_not_set)
ASSERT_NOT_REACHED();
bool first = true;
for (auto& arg : value.argv) {
if (!first)
builder.put_literal(" ");
first = false;
builder.put_literal(arg);
if (value.argv.is_empty()) {
builder.put_literal("(ShellInternal)");
} else {
bool first = true;
for (auto& arg : value.argv) {
if (!first)
builder.put_literal(" ");
first = false;
builder.put_literal(arg);
}
}
for (auto& redir : value.redirections) {
builder.put_padding(' ', 1);
if (redir.is_path_redirection()) {
auto path_redir = (const Shell::AST::PathRedirection*)&redir;
builder.put_i64(path_redir->fd);
switch (path_redir->direction) {
case Shell::AST::PathRedirection::Read:
builder.put_literal("<");
break;
case Shell::AST::PathRedirection::Write:
builder.put_literal(">");
break;
case Shell::AST::PathRedirection::WriteAppend:
builder.put_literal(">>");
break;
case Shell::AST::PathRedirection::ReadWrite:
builder.put_literal("<>");
break;
}
builder.put_literal(path_redir->path);
} else if (redir.is_fd_redirection()) {
auto* fdredir = (const Shell::AST::FdRedirection*)&redir;
builder.put_i64(fdredir->new_fd);
builder.put_literal(">");
builder.put_i64(fdredir->old_fd);
} else if (redir.is_close_redirection()) {
auto close_redir = (const Shell::AST::CloseRedirection*)&redir;
builder.put_i64(close_redir->fd);
builder.put_literal(">&-");
} else {
ASSERT_NOT_REACHED();
}
}
if (!value.next_chain.is_empty()) {

View File

@ -563,7 +563,7 @@ RefPtr<Job> Shell::run_command(const AST::Command& command)
FileDescriptionCollector fds;
if (options.verbose)
warnln("+ {}", m_pid, command);
warnln("+ {}", command);
// If the command is empty, store the redirections and apply them to all later commands.
if (command.argv.is_empty() && !command.should_immediately_execute_next) {