import platform
from ..subprocess_code_interpreter import SubprocessCodeInterpreter
import ast
import os
class Shell(SubprocessCodeInterpreter):
file_extension = "sh"
proper_name = "Shell"
def __init__(self):
super().__init__()
if platform.system() == 'Windows':
self.start_cmd = 'cmd.exe'
else:
self.start_cmd = os.environ.get('SHELL', 'bash')
def preprocess_code(self, code):
return preprocess_shell(code)
def line_postprocessor(self, line):
return line
def detect_active_line(self, line):
if "## active_line " in line:
return int(line.split("## active_line ")[1].split(" ##")[0])
return None
def detect_end_of_execution(self, line):
return "## end_of_execution ##" in line
def preprocess_shell(code):
code = add_active_line_prints(code)
if platform.system() != 'Windows':
code = wrap_in_trap(code)
code += '\necho "## end_of_execution ##"'
return code
def add_active_line_prints(code):
lines = code.split('\n')
for index, line in enumerate(lines):
lines[index] = f'echo "## active_line {index + 1} ##"\n{line}'
return '\n'.join(lines)
def wrap_in_trap(code):
trap_code = """
trap 'echo "An error occurred on line $LINENO"; exit' ERR
set -E
"""
return trap_code + code