Esta é uma maneira correta de testar se o link simbólico possui o diretório / proc /

1

Eu preciso testar se /etc/mtab é um link simbólico para /proc/something . Eu preciso cumprir o padrão POSIX. (Em geral, deve ser executado no RHEL 5 para o RHEL 7.) Isso é o que eu tenho até agora:

#!/bin/bash
if [ $(readlink -f /etc/mtab | grep '\/proc\/') ]; then
    echo do something related to proc
else
    echo do something other than proc
fi

Estou sentindo falta de alguns casos extremos?

    
por MikasaAckerman 05.10.2016 / 19:38

2 respostas

2
  1. E se /etc/mtab for um link simbólico para /home/mikasa/proc/something ? Você provavelmente deve adicionar um ^ à expressão regular do seu grep.
  2. Falando nisso, / não é um caractere especial em expressões regulares, então você não precisa escapar deles.
  3. Você deve citar referências de variáveis de shell a menos que você tenha uma boa razão para não e você tem certeza de que sabe o que está fazendo. Isso inclui substituições de comandos $(…) . No caso da borda verdadeiramente patológica, em que /etc/mtab é um link simbólico para /proc/foo = bar , seu comando se expande para
    if [ /proc/foo = bar ]
    , claro, avalia a falsa. Você pode corrigir isso colocando o $(…) entre aspas duplas:
    if [ "$(readlink -f /etc/mtab | grep '^/proc/')" ]; then
  4. Mas você não precisa fazer substituição de comando ou test (a.k.a. [] ). grep fornece um status de saída que indica se ele encontrou o padrão você disse para procurar, então você deve ser capaz de simplificar seu comando para:
    if readlink -f /etc/mtab | grep '^/proc/' > /dev/null; then
por 06.10.2016 / 09:01
2

Seu código parece fazer o que você quer, embora readlink -f não seja POSIX.

Outra boa solução não POSIX seria:

if [ "$(df --output=fstype  /etc/mtab  | tail -n +2)" = "proc" ]; then

(Isso deve funcionar mesmo se o sistema de arquivos proc não estiver montado em / proc)

Mas talvez no mundo real isso seja suficiente para simplesmente verificar

if [ -L /etc/mtab ]; then

O último é usado até mesmo no util-linux test-suite e eles não receberam nenhum relatório de bug até o momento. Parece que em qualquer distribuição Linux existente / etc / mtab é um arquivo regular ou um link simbólico para / proc / self / mounts.

    
por 05.10.2016 / 20:02