| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import bashlex
- from openhands.core.logger import openhands_logger as logger
- def split_bash_commands(commands):
- if not commands.strip():
- return ['']
- try:
- parsed = bashlex.parse(commands)
- except bashlex.errors.ParsingError as e:
- logger.debug(
- f'Failed to parse bash commands\n'
- f'[input]: {commands}\n'
- f'[warning]: {e}\n'
- f'The original command will be returned as is.'
- )
- # If parsing fails, return the original commands
- return [commands]
- result: list[str] = []
- last_end = 0
- for node in parsed:
- start, end = node.pos
- # Include any text between the last command and this one
- if start > last_end:
- between = commands[last_end:start]
- logger.debug(f'BASH PARSING between: {between}')
- if result:
- result[-1] += between.rstrip()
- elif between.strip():
- # THIS SHOULD NOT HAPPEN
- result.append(between.rstrip())
- # Extract the command, preserving original formatting
- command = commands[start:end].rstrip()
- logger.debug(f'BASH PARSING command: {command}')
- result.append(command)
- last_end = end
- # Add any remaining text after the last command to the last command
- remaining = commands[last_end:].rstrip()
- logger.debug(f'BASH PARSING remaining: {remaining}')
- if last_end < len(commands) and result:
- result[-1] += remaining
- logger.debug(f'BASH PARSING result[-1] += remaining: {result[-1]}')
- elif last_end < len(commands):
- if remaining:
- result.append(remaining)
- logger.debug(f'BASH PARSING result.append(remaining): {result[-1]}')
- return result
|