Просто grep никогда не сможет удалить все комментарии (или только комментарии), потому что grep не понимает язык, который он просматривает. Чтобы понять, что такое комментарий, а что нет, вам понадобится лексер , который понимает этот конкретный язык.
Есть несколько ответов на SO о том, как удалить все комментарии из определенных языков программирования. Я добавлю сюда два примера.
Для C ответ Джоша Ли утверждает:
gcc -fpreprocessed -dD -E test.c
Которая запускает препроцессор, но сохраняет макросы.
Для python ответ unutbu (с небольшой адаптацией мной) пишет небольшой лексический анализатор с использованием tokenize:
import tokenize
import io
import sys
def nocomment(s):
result = []
g = tokenize.generate_tokens(io.BytesIO(s).readline)
for toknum, tokval, _, _, _ in g:
# print(toknum,tokval)
if toknum != tokenize.COMMENT:
result.append((toknum, tokval))
return tokenize.untokenize(result)
print(nocomment(sys.stdin.read()))
Затем вы можете написать по одному из них для каждого языка программирования и использовать кейс. Предполагая, что лексер python называется remove-comments.py
#!/bin/sh
case "$1" in
*.py)
remove-comments.py < "$1"
break
;;
*.c|*.C|*.cc)
gcc -fpreprocessed -dD -E "$1"
break
;;
*)
echo I do not know how to remove comments from $1, sorry
break
;;
esac
Дайте имя сценарию и добавьте лексеры для нужных / используемых языков . Это должна быть более или менее надежная конструкция для удаления комментариев из файлов разных типов. (Использование файла
вместо регистра в именах файлов также было бы более надежным).
Это потому, что sudo -s
запускает корневую оболочку, и именно там вы окажетесь после ввода пароля. Если вы затем выйдете из оболочки, вы увидите код , который требует sudo
:
$ foo.sh
Code that don't need sudo.
[sudo] password for terdon:
[root@tpad terdon]# exit
Code that need sudo
В общем, во всех сценариях, когда вы говорите ему запустить команду, сценарий продолжит выполнение только после команды закончил. Итак, когда ваш скрипт запустил sudo -s
, он дождался его завершения, прежде чем продолжить. Вот почему текст был напечатан после того, как я запустил exit
(или нажал ctrl + D ).
-s
без команды запускает интерактивную оболочку, поэтому вы больше не будете в той же оболочке, что и сценарий.
Подробнее см. man sudo
.
Это должно сработать:
#!/bin/bash
example()
{
echo "Code that don't need sudo."
sudo -s echo "Code that need sudo"
}
example