简体   繁体   中英

Linux ~/.bashrc export most recent directory

I have several environment variables in my ~/.bashrc that point to different directories. I am running a program that creates a new folder every time that it runs and puts a time stamp in the directory name. For example, baseline_2015_11_10_15_40_31-model-stride_1-type_1 . Is there away of making a variable that can link to the last created directory?

cd $CURRENT_DIR

Your mileage may vary a lot depending on what exactly do you need to accomplish. However, it almost all cases I would advise against doing something that weird and unreliable like what's described below and revise your architecture to avoid hunting for directories.

Method 1

If your program creates a subdirectory inside current directory, and you always know that nothing else happens in that directory and you want a subdirectory with latest creation timestamp, then you can do something like:

your_complex_program_that_creates_dir
TARGET_DIR=$(ls -t1 --group-directories-first | head -n1)
cd "$TARGET_DIR"

Method 2

If a lot of stuff happens on the system, then you'll end up monitoring what your program does with the filesystem and reacting when it creates a directory. There are two ways to do that, using strace and inotify , both are relatively complex. Here's the way to do that with strace:

strace -o some_temp_file.strace your_complex_program_that_creates_dir
TARGET_DIR=$(sed -ne '/^mkdir(/ { s/^mkdir("\(.*\)", .*).*$/\1/; p }' some_temp_file.strace
cd "$TARGET_DIR"

This snippet runs your_complex_program_that_creates_dir under control of strace , which essentially logs every system call your program makes into a file. Afterwards, this file is analyzed to seek a line like

mkdir("target_dir", 0777)                       = 0

and extract value of "target_dir" into a variable. Note that:

  1. if your program creates more than 1 directory (even for temporary purposes and deletes them afterwards, or whatever) — there's really no way to determine which of them to grab
  2. running a program with strace is much slower that normal due to huge overhead of logging all the syscalls.
  3. it's super non-portable — facilities like strace exist on most modern OS, but implementations will vary a lot

A solution with inotify works in the same way, but using different mechanism — ie it uses OS hook to log all the operations that process performs with file system and then react to it (remember created directory).

However, I repeat, I'd strongly suggest against using any of these solutions beyond research interest.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM