Você está se preparando para problemas futuros, enquadrando a pergunta dessa maneira.
4 décadas de sabedoria Unix nos dizem que o melhor caminho para a portabilidade é testar recursos específicos, e não plataformas inteiras.
Certamente você tem em mente alguma distinção específica entre sistemas de 32 e 64 bits, mas garanto que essa diferença não é universal. Existem muitos tipos de 64 bits . (E muitos tipos de 32 bits.)
Você já se limitou ao Linux, tanto pela tag na pergunta, mas também pela maneira como você fez a pergunta. Mas, você tem certeza de que este script que você está desenvolvendo nunca precisará rodar no OS X, um dos BSDs, ou mesmo um sistema Unix "real"?
-
arch
é um método particularmente ruim. Ele informa sobre os tipos de CPU, não os tamanhos das palavras do sistema operacional e, mesmo assim, pode ser enganoso. No OS X da Intel, por exemplo, ele informa i386
, mesmo em um sistema de 64 bits. Não está nem disponível em todos os Linuxes.
-
uname -m
e uname -p
também informam sobre o tipo de CPU, em vez dos tamanhos de palavras nativas do sistema operacional.
-
uname -i
não é portátil e, mesmo no Linux, pode imprimir "desconhecido".
A resposta certa depende de por que você quer saber. Se é porque você está desenvolvendo um software C que precisa fazer a coisa certa em 64 bits, então você precisa escrever um programa que sondasse o comportamento:
#include <stdio.h>
int main() {
printf("long long = %d bits\n", sizeof(long long) * 8);
printf("long = %d bits\n", sizeof(long) * 8);
printf("void* = %d bits\n", sizeof(void*) * 8);
printf("size_t = %d bits\n", sizeof(size_t) * 8);
printf("int = %d bits\n", sizeof(int) * 8);
return 0;
}
A saída desse programa irá variar entre os sistemas que supostamente compartilham o mesmo tamanho de palavra nativa. Ele varia mesmo quando executado no mesmo hardware físico, mas em sistemas operacionais diferentes.