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

Можно использовать Редактор изображений GIMP и использовать Экспорт в инструмент. Используйте Ctrl-Shift-E в качестве ярлыка.
Или Вы могли использовать convert от imagemagick:

convert filename.xcf filename.png

Вы могли также использовать xcftools (sudo склонный - получают установку xcftools), которому назвали утилиту xcf2png это делает это задание отлично.

xcf2png image.xcf -o image.png
8
17.09.2014, 23:17
6 ответов

strace не запускает rm -i по той же причине, что и:

echo rm

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

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

В:

alias foo='whatever'
foo xxx

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

whatever xxx

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

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

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

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

alias -g rm='rm -i'

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

echo rm

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

20
27.01.2020, 20:08

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

Предположим, что у нас есть определение псевдонима псевдоним 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

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

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

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

Внутри строки команда будет вызвана с чем-то похожим на 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.

Псевдонимы управляются опцией оболочки expansion_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!

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

2
27.01.2020, 20:08

strace использует execve c function , например, find command , однако find использует exec function Нельзя использовать псевдонимы , встроенные команды оболочки или так далее.

Необходимо выполнить:

strace /bin/rm -i ramesh
-121--46499-

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

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

-121--46498-

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

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

8
27.01.2020, 20:08

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

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

5
27.01.2020, 20:08

strace использует execution c function, например find command, однако find use exec function Вы не можете использовать aliases, встроенную команду оболочки и так далее.

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

strace /bin/rm -i ramesh
2
27.01.2020, 20:08

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

alias strace="strace "

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

strace rm ramesh

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

strace rm -i ramesh

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

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

, то

my_strace rm ramesh

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

strace -ff -e trace=file rm -i ramesh
2
27.01.2020, 20:08

Теги

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