Или, если вы чувствуете себя особенно смелым, gdb
!
% lsof | grep deleted | grep deleteme
% perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme & rm deleteme
[2] 15720
% lsof | grep deleted | grep deleteme
perl 15720 jdoe42 1w REG 8,2 0 5376141 /home/jdoe42/deleteme (deleted)
% gdb -q -p 15720
...
(gdb) call close(1)
$1 = 0
(gdb) quit
...
% lsof | grep deleted | grep deleteme
% jobs
[1] - running perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme
% kill %1
%
[1] + terminated perl -E 'while(1){ say "om nom nom"; sleep 1 }' > deleteme
%
Однако это может сработать или не сработать, может сломать программу, с которой вы возитесь, неожиданным образом, вызвать выпадение волос, синдром внезапного использования Windows, и так далее. Другими словами, используйте на свой страх и риск. Простое удаление программы чаще всего оказывается гораздо лучшим вариантом.
Ключевыми моментами являются получение номера дескриптора файла (через lsof
или эквивалент), который здесь является STDOUT_FILENO
(1w
согласно lsof
), поскольку именно на него перенаправляет оболочка, а затем вызов close(2)
на этом дескрипторе файла. Файлы, открытые самой программой, скорее всего, будут иметь более высокие номера дескрипторов (от трех и выше); вопрос показывает, что стандартная ошибка идет в файл /tmp
(что, по-видимому, является локальным недостатком безопасности, чтобы записать статическое имя файла под /tmp
подобным образом).
Los enlaces git
no tienen nada que ver con el PATH, son una medida -de ahorro de espacio.
En términos generales, en la mayoría de los casos para el software "instalado", los enlaces físicos son preferibles a los enlaces simbólicos cuando sea posible, porque son más eficientes y resistentes. Verá bastantes binarios en /usr/bin
con enlaces duros, incluido perl
, y eso está bien.
git
los paquetes tienden a usar enlaces simbólicos en su lugar, debido a la gran cantidad de enlaces involucrados y los problemas que pueden causar . Si instala git
desde la fuente, usará enlaces duros de forma predeterminada si es posible; puede deshabilitarlo agregando NO_INSTALL_HARDLINKS=1
a los argumentos del comando make install
.
A menudo, un solo binario con múltiples funciones relacionadas tiene múltiples enlaces duros, para permitir que cada función tenga un comando distinto y memorable, y aún así no duplicar ningún código que todas esas funciones puedan tener en común.
Hacer que las diversas funciones de un solo binario aparezcan como comandos distintos también es una forma fácil, independiente -de shell para hacer que las funciones TAB -se puedan completar :, por ejemplo, en bash
, si solo recuerda las primeras letras de algún comando, simplemente escriba las letras que recuerde y presione TAB dos veces :obtendrá una lista de todos los comandos con esas letras iniciales.
También se pueden usar enlaces simbólicos para esto, pero si se espera que todos los comandos enlazados estén en el mismo directorio, los enlaces duros son la solución más -eficiente :en lugar de duplicar un archivo completo, o simplemente al usar un inodo adicional como lo haría un enlace simbólico (en algunos sistemas de archivos ), un enlace duro ocupa solo una entrada de directorio.
Si lo desea, también puede hacer que un script se comporte así fácilmente:
#!/bin/sh
case "${0##*/}" in
name1)
# do something
;;
name2)
# do something else
;;
*)
# output an error message, or perhaps usage instructions
;;
esac