O número fd de vários shells é fixo?

3

Digamos que:

xb@dnxb:/tmp$ echo 'ls -l /proc/$$/fd | grep a.sh' > a.sh; \
> while IFS='' read -r f; do \
> echo "$f"; "$f" a.sh; \
> done < <(tail -n +2 /etc/shells)
/bin/sh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/dash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/bash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 255 -> /tmp/a.sh
/bin/rbash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 255 -> /tmp/a.sh
/bin/zsh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 11 -> /tmp/a.sh
/usr/bin/zsh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 11 -> /tmp/a.sh
/bin/ksh93
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/rksh93
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
xb@dnxb:/tmp$ 

O bash sempre fixou o número fd 255 e o zsh corrigiu o número fd 11 por padrão?

Eu faço esta pergunta porque eu preciso extrair o caminho completo executado a partir de qualquer processo shell. Gostaria de poder codificar meu script para referir esses números fixos ou não.

Note que isto é para um script pessoal e não para funcionar em negócios críticos, por isso não estou à procura de 100% de confiança, mas o número fd é fixo na maioria dos casos ?

[UPDATE]:

O motivo pelo qual não analiso o cmdline é porque:

xb@dnxb:~/Downloads$ cat foo.sh 
#!/bin/bash
cat "/proc/$$/cmdline" | tr '
xb@dnxb:/tmp$ echo 'ls -l /proc/$$/fd | grep a.sh' > a.sh; \
> while IFS='' read -r f; do \
> echo "$f"; "$f" a.sh; \
> done < <(tail -n +2 /etc/shells)
/bin/sh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/dash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/bash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 255 -> /tmp/a.sh
/bin/rbash
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 255 -> /tmp/a.sh
/bin/zsh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 11 -> /tmp/a.sh
/usr/bin/zsh
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 11 -> /tmp/a.sh
/bin/ksh93
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
/bin/rksh93
lr-x------ 1 xiaobai xiaobai 64 Jan  20 00:09 10 -> /tmp/a.sh
xb@dnxb:/tmp$ 
' '\n' readlink -f /proc/$$/fd/255 xb@dnxb:~/Downloads$ bash --norc foo.sh --norc bash --norc foo.sh --norc /home/xiaobai/Downloads/foo.sh xb@dnxb:~/Downloads$

Como você pode ver, apenas fd pode fornecer o caminho completo /home/xiaobai/Downloads/foo.sh , mas não o cmdline . E o script não pode distinguir foo.sh ou --norc é um caminho ou uma opção, pois foo.sh pode aparecer em qualquer posição de opção, a menos que eu faça uma verificação feia, como não é startswith -- .

Embora fd não tenha problemas para produzir o caminho completo correto, até mesmo eu faço bash --norc foo.sh --norc foo2.sh .

De qualquer forma, acabei de perceber que minha tarefa não precisa verificar isso, pois notei que nenhum processo do sistema, exceto o processo personalizado, é herdado do shell. Mas ainda assim qualquer resposta ajudará ao futuro leitor.

    
por 林果皞 19.01.2018 / 17:18

1 resposta

0

Expandindo meu comentário acima, você pode usar /proc/<pid>/cmdline para obter as informações de seu interesse. Note que os tokens são delimitados por caracteres NIL, então você terá que processar a saída um pouco:

cat /proc/<pid>/cmdline | tr "
$ cat foo.sh
#!/bin/bash
echo $(cat "/proc/$$/cmdline" | tr "
$ bash foo.sh
bash foo.sh

$ ./foo.sh
/bin/bash ./foo.sh

$ ./foo.sh 1 2 3 4
/bin/bash ./foo.sh 1 2 3 4
" " ")
" " "

Então, se por exemplo eu tenho:

$ ls -l /proc/$$/exe
... /proc/12345/exe -> /bin/bash

Aqui estão algumas amostras:

cat /proc/<pid>/cmdline | tr "
$ cat foo.sh
#!/bin/bash
echo $(cat "/proc/$$/cmdline" | tr "
$ bash foo.sh
bash foo.sh

$ ./foo.sh
/bin/bash ./foo.sh

$ ./foo.sh 1 2 3 4
/bin/bash ./foo.sh 1 2 3 4
" " ")
" " "

Note que nem sempre você obtém o caminho completo para o binário. Para isso, você poderia olhar para /proc/<pid/exe :

$ ls -l /proc/$$/exe
... /proc/12345/exe -> /bin/bash

Isso pode não ser o que você procura, eu simplesmente não entendo como olhar os descritores de arquivos abertos vai lhe dar o que você quer.

    
por 19.01.2018 / 23:29