¿Por qué Mac Terminal recuerda dos comandos consecutivos cuando son iguales?

9

Comencé a usar Mac recientemente y antes de trabajar en Ubuntu.

Supongamos que ejecuto estos comandos uno por uno en mi terminal:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Ahora suponga que quiero ejecutar python main.py otra vez, por lo que haré clic en la tecla arriba. Tendré que hacer clic en la tecla de arriba solo dos veces en Ubuntu pero 7 veces en Mac.

Si dos comandos consecutivos son iguales, entonces el terminal debería recordar solo un comando en lugar de recordar dos comandos diferentes.

¿Cómo puedo hacer que esto suceda en macOS?

    
pregunta Abhishek Agrawal 19.11.2017 - 11:18

3 respuestas

13

Debe agregar la variable de entorno HISTCONTROL a su .bash_profile . En su .bash_profile agregue la siguiente línea:

export HISTCONTROL=ignoreboth:erasedups

Cierra y reinicia tu sesión de bash y los dupes deberían haberse ido. Alternativamente, puedes ejecutar esa misma línea y entrará en vigencia para esa sesión (utilízala para probarlo).

De la página de manual para bash (en la Terminal):

  

HISTCONTROL
  Una lista de valores separados por dos puntos que controlan cómo se guardan los comandos en la lista de historial. Si la lista de valores incluye ignorespace , las líneas que comienzan con un carácter de espacio no se guardan en la lista del historial. Un valor de ignoredups hace que las líneas que coincidan con la entrada del historial anterior no se guarden. Un valor de ignoreboth es una abreviatura de ignorespace y ignoredups . Un valor de borrados hace que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de que se guarde esa línea. Cualquier valor que no esté en la lista anterior se ignora. Si HISTCONTROL no está establecido, o no incluye un valor válido, todas las líneas leídas por el analizador de shell se guardan en la lista del historial, sujeto al valor de HISTIGNORE . La segunda línea y las siguientes de un comando compuesto multilínea no se prueban, y se agregan al historial independientemente del valor de HISTCONTROL .

    
respondido por el Allan 19.11.2017 - 13:43
4

¿Por qué sucede esto?

MacOS y Ubuntu se configuran de manera diferente para manejar duplicados en el historial de comandos de bash. Estas configuraciones se almacenan en una serie de llamados " archivos de puntos ". Estos toman la forma de ~ / .bash * así como el sistema / etc / profile. Todos estos archivos se pueden personalizar a su gusto y diferenciar entre shells interactivos, shells de inicio de sesión, shells remotos etc. Estos archivos se leen en un orden específico y sirven funciones específicas .

¿Cómo obtener el mismo comportamiento en macOS?

Si solo desea esto, la personalización individual de "ignorar los duplicados exactos de las líneas de comando" puede ir con algo como la respuesta de Allan, es decir, agregar una sola línea a, por ejemplo, su archivo bash_profile. No hay "la forma correcta" sino innumerables opciones.

En caso de que esta no sea la única personalización para tu bash, entonces podría no ser la mejor opción:

  
  • ~/.bash_profile debe ser super simple y simplemente cargar .profile y .bashrc (en ese orden)

  •   
  • ~ / .profile tiene cosas que NO están específicamente relacionadas con bash, como las variables de entorno (PATH y amigos)

  •   
  • ~ / .bashrc tiene todo lo que deseas en una línea de comandos interactiva. Símbolo del sistema, variable EDITOR, bash alias para mi uso
  •   

Algunas otras notas:

     
  • Todo lo que debería estar disponible para aplicaciones gráficas O para sh (o bash invocado como sh) DEBE estar en ~ / .profile
  •   
  • ~ / .bashrc no debe generar nada
  •   
  • Todo lo que debería estar disponible solo para iniciar sesión en shells debe ir en ~ / .profile
  •   
  • Asegúrese de que ~ / .bash_login no exista.
  •   

Eso significa que, cuando las cosas se vuelven más complejas, es buena idea para distribuye las personalizaciones en varios archivos, cada uno de ellos especializado y altamente ordenado en sus contenidos:

Todos los exports pueden residir en su propio archivo para una supervisión simplificada.

Cree un archivo que bash lea en la raíz de su directorio de usuarios, por ejemplo, llamado .exports que contiene:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Esto debe ser "originado" para que el archivo sea leído por bash en el inicio interactivo:

  

Sourcing files
  Si tiene muchas configuraciones de shell, puede dividirlas en varios subarchivos y usar el código fuente incorporado para cargarlos desde su .bashrc:   con la adición de source ~/.exports a él.

Alternativamente, para asegurarse de que los archivos realmente existan antes de cargarlos

if [ -f ~/.exports ]; then
. ~/.exports
fi

El comando . ~/.exports generará ~/.exports en el contexto del shell actualmente en ejecución.

  

Esto es particularmente útil para agregar alias, el archivo separado hace que sea más fácil volver a cargarlos cuando haces cambios.

    
respondido por el LangLangC 19.11.2017 - 13:45
1

Grabar uniqamente cada nuevo comando es complicado. Primero necesitas agregar a ~/.profile o similar:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Luego debes agregar a ~/.bash_logout :

history -a
history -w
    
respondido por el Steven Penny 04.02.2018 - 00:18

Lea otras preguntas en las etiquetas