Что произошло после sudo -s [duplicate]

Просто 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

Дайте имя сценарию и добавьте лексеры для нужных / используемых языков . Это должна быть более или менее надежная конструкция для удаления комментариев из файлов разных типов. (Использование файла вместо регистра в именах файлов также было бы более надежным).

1
03.03.2017, 04:50
2 ответа

Это потому, что 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 ).

3
27.01.2020, 23:14

-s без команды запускает интерактивную оболочку, поэтому вы больше не будете в той же оболочке, что и сценарий.

Подробнее см. man sudo .

Это должно сработать:

#!/bin/bash
example()
{

    echo "Code that don't need sudo."
    sudo -s echo "Code that need sudo"
 }

example
3
27.01.2020, 23:14

Теги

Похожие вопросы