почему strace игнорирует мой псевдоним для rm?

У меня есть alias для моей команды rm . Если я запускаю команду alias , это то, что я получаю как вывод.

 alias rm='rm -i' 

Теперь, когда я запускаю команду rm она работает нормально, как ожидалось.

 rm ramesh rm: remove regular empty file `ramesh'? y 

Теперь я изучал системные вызовы, вызываемые при выполнении команды. Для этого я узнал о команде strace отсюда, которая перечисляет мне файлы, вызываемые при выполнении какой-либо команды. Команда приведена ниже.

 strace -ff -e trace=file rm ramesh 2>&1 

Команда работает отлично, за исключением того, что она игнорирует мои псевдонимы, которые у меня есть для моей команды rm . Он удаляет файл без запроса пользователя.

Таким образом, strace игнорирует подобные псевдонимы? Если да, то почему?

РЕДАКТИРОВАТЬ:

Не уверен, если это что-то делать, но type -a rm дает мне результат как,

 rm is aliased to `rm -i' rm is /bin/rm 

Так он рассматривает /bin/rm в этом случае, почему пользователь не запрашивается перед удалением?

  • Почему нет / bin / login в выводе ps при входе в систему
  • Команда для отслеживания rsh-сервера для проверки поведения конкретного системного вызова
  • Как (если возможно) я могу закончить конкретный блокиратор, зависающий программой?
  • Как определить определенный системный вызов, вызванный или нет, во всем рабочем процессе?
  • Неустранимые процессы apache2
  • Понимать этот вывод strace
  • Интерпретация времени, показанного на strace для открытых системных вызовов
  • Выход Strace не отображает системный вызов
  • 6 Solutions collect form web for “почему strace игнорирует мой псевдоним для rm?”

    strace не работает rm -i по той же причине, что и:

     echo rm 

    не выводит rm -i .

    Псевдонимы – это функция нескольких оболочек, позволяющая некоторым строкам автоматически заменяться на другую, когда она находится в командной позиции.

    В:

     alias foo='whatever' foo xxx 

    Оболочки расширяют это:

     whatever xxx 

    и в этом случае происходит еще один раунд интерпретации, в этом случае приводящий к выполнению whatever команды.

    псевдонимы расширяются только тогда, когда они находятся в командной позиции (в качестве первого слова командной строки).

    zsh поддерживает глобальные псевдонимы.

    Вы можете сделать:

     alias -g rm='rm -i' 

    Но вы не захотите, потому что это будет означать:

     echo rm 

    например, выводит rm -i .

    strace использует PATH среды PATH чтобы найти трассируемую программу, а не выполнять ее через оболочку (что загромождает выход). Алиас оболочки не является программой, это особенность оболочки, и поэтому strace игнорирует ее.

    Запуск strace strace rm довольно просвещен, а также является интересным рекурсивным.

    Псевдоним – это свойство вашей оболочки. Однако strace выполняет команду напрямую (используя execve , возможно), которая не включает оболочку. (Если strace выполнил заданную команду через оболочку, тогда вывод strace будет содержать все системные вызовы оболочки, а не только те из процесса, который представляет интерес.)

    Кроме того, когда вы запускаете strace rm ramesh , интерактивная оболочка не пытается заменить ваш псевдоним аргументами strace, потому что это было бы ужасно запутанным для всех. Оболочка только расширяет псевдонимы, которые появляются в первой позиции в командной строке.

    strace использует execve c function такую ​​как find command , но find uses exec function Вы не можете использовать aliases , built-in shell command или так далее.

    Ты должен сделать:

     strace /bin/rm -i ramesh 

    Чтобы построить ответ Стефана Хазеласа, если вы определите

     alias strace="strace " 

    (с пробелом в конце), то команда

     strace rm ramesh 

    будут обрабатываться как

     strace rm -i ramesh 

    Но даже это будет работать только для первого слова после strace , поэтому оно не будет применяться непосредственно к вашему примеру (где у вас есть промежуточные варианты). Но если вы определите

     alias my_strace="strace -ff -e trace=file " 

    тогда

     my_strace rm ramesh 

    будут обрабатываться как

     strace -ff -e trace=file rm -i ramesh 

    Нет псевдонимов здесь

    Предположим, у нас есть псевдоним определения alias rm='rm -i' в нашем ~/.bashrc . Псевдоним добавляет параметр для запроса перед удалением каждого файла:

     $ touch ./file $ rm ./file /bin/rm: remove regular empty file './file'? 

    Это не ошибка strace что он не использовал псевдоним:
    Это не имеет ничего общего с псевдонимами.

    В команде

     $ strace -f -e file -o rm.strace rm ./file 

    Слова rm и ./file являются аргументами для strace – оболочка не может расширять псевдоним rm , потому что не может знать, что strace будет использовать эти аргументы как команду позже.

    В общем случае псевдонимы команд могут использоваться только там, где могут быть команды.

    Псевдонимы – это свойство оболочки, и strace вообще не использует оболочку при вызове команды из командной строки. Вместо этого он использует exec() , с командами и аргументами из собственной командной строки.

    Внутри strace команда будет вызвана с чем-то похожим на exec("rm", "file") , а exec() найдет /bin/rm в PATH – без использования оболочки.

    Явная оболочка

    Итак, почему бы не включить оболочку в команду strace ?

     $ touch ./file $ strace -f -e file -o rm.strace bash -c 'rm ./file' $ ls ./file ls: cannot access ./file: No such file or directory 

    Хм … это не сработало. rm просто удалил файл без подсказки -i .

    Интерактивные псевдонимы

    Псевдонимы обычно включаются только в интерактивные оболочки, фактические командные строки в терминале.
    С нашим псевдонимом примера легко понять, почему это имеет смысл: если псевдоним rm -i будет расширяться внутри сценариев оболочки, они будут висеть на первом rm и никто не будет там для нажатия y .

    Псевдонимы контролируются опцией оболочки expand_aliases . Мы могли бы установить параметр с помощью bash +O expand_aliases -c ... Но этого недостаточно, потому что неинтерактивная оболочка также не будет читать ~/.bashrc . Это означает, что наш псевдоним не только отключен опцией, но и даже не определен.

    Притворяясь интерактивным

    Легкий способ обработки обеих частей – использовать параметр командной строки -i чтобы заставить оболочку притворяться интерактивной:

     $ touch ./file $ strace -f -e file -o rm.strace bash -i -c 'rm ./file' /bin/rm: remove regular empty file './file'? 

    Наконец, был использован псевдоним -i !

    Обратите внимание, что обычно вы не используете оболочки, работающие с параметром -i для сценариев, даже если вы хотите, чтобы ваши псевдонимы были доступны, например.

    Linux и Unix - лучшая ОС в мире.